我使用 array_diff() 从 array1 中取出在 array2 中找到的值。问题是它删除了 array1 中的所有出现项,正如 PHP 文档所指出的那样。我希望它一次只取出一个。
$array1 = array();
$array1[] = 'a';
$array1[] = 'b';
$array1[] = 'a';
$array2 = array();
$array2[] = 'a';
它应该返回一个包含一个“a”和一个“b”的数组,而不是仅包含“b”的数组;
只是为了好玩,才想到的。只要你的数组包含字符串就可以工作:
$a = array('a','b','a','c');
$b = array('a');
$counts = array_count_values($b);
$a = array_filter($a, function($o) use (&$counts) {
return empty($counts[$o]) || !$counts[$o]--;
});
它的优点是它只遍历每个数组一次。
查看实际效果 http://ideone.com/LUvMHS.
怎么运行的:
首先计算第二个数组中每个元素的频率。这给了我们一个数组,其中键是应该从中删除的元素$a
value 是每个元素应被删除的次数。
Then array_filter
用于检查的元素$a
一件一件地把该去掉的去掉。过滤函数使用empty
回来true
如果没有与正在检查的项目相同的键,或者该项目的剩余移除计数已达到零;empty
的行为完全符合要求。
如果以上都不成立,那么我们要返回false
并将移除计数减一。使用false || !$counts[$o]--
为了简洁起见,这是一个技巧:它减少计数并始终评估为false
因为我们知道计数一开始就大于零(如果不是,||
评估后会短路empty
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)