//Pseudo code
//Use one of the two ways
if(condition){ //1. Condition fulfilled
$newArray[ ] = $value;
//↑ Put '$key' there, if you want to keep the original keys
//Result array is: $newArray
} else { //2. Condition NOT fulfilled
unset($array[$key]);
//Use array_values() after the loop if you want to reindex the array
//Result array is: $array
}
//This will create an anonymous function that will filter the items in the array by the value supplied
function cb_equal_to($val)
{
return function($item) use ($val) {
return $item == $val;
};
}
$input = array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2);
// Use array_filter on a input with a selected filter function
$filtered_array = array_filter($input, cb_equal_to(2));
9条答案
按热度按时间ckx4rj1h1#
baubqpgj2#
你必须循环遍历数组,并根据条件过滤每个元素,这可以通过各种方法来实现。
循环
while
/for
/foreach
方法用你想要的任何循环遍历你的数组,可以是
while
,for
或者foreach
。然后简单地检查你的条件,如果元素不满足你的条件,unset()
元素,或者将满足条件的元素写入一个新的数组。循环
条件
只要把你的条件放到注解
//condition
所在的循环中,条件可以检查你想要的任何东西,然后你可以unset()
不满足你的条件的元素,如果你想要的话,用array_values()
重新索引数组,或者把满足条件的元素写入一个新的数组。方法
另一种方法是使用
array_filter()
内置函数,它的工作原理与简单循环的方法基本相同。如果要将元素保留在数组中,只需返回
TRUE
;如果要将元素从结果数组中删除,则只需返回FALSE
。方法
preg_grep()
与array_filter()
类似,只是它只使用正则表达式来过滤数组,所以您可能无法使用它来完成所有操作,因为您只能使用正则表达式作为过滤器,并且只能通过值或通过键来过滤。还请注意,您可以将标志
PREG_GREP_INVERT
作为第三个参数传递,以反转结果。常见条件
有很多常见的条件可以用来过滤数组,它们都可以应用于数组的值和/或键。我将在这里列出其中的一些条件:
yuvru6vn3#
你可以在键的副本上迭代,以便在循环中使用
unset()
:如果数组包含大值,此方法的优点是内存效率-它们不会重复。
EDIT我刚刚注意到,您实际上只需要值为2的键(您已经知道该值):
f8rj6qna4#
这应该可以工作,但我不确定它的效率如何,因为您可能最终复制了大量数据。
v8wbuo2f5#
这个问题可以通过闭包来解决。下面的答案是从PHP The Right Way得到的启发:
现在,$filtered_array的内容将为
x8diyxa76#
我认为最快、最可读的内置函数是:array_intersect()
代码:(Demo)
输出:
只需确保将第二个参数声明为数组,因为这是预期的值类型。
现在写出foreach循环或使用
array_filter()
没有什么问题,只是语法更冗长。array_intersect()
也非常容易扩展(包括额外的“限定”值),只需向第二个参数数组添加更多值即可。从PHP7.4开始,可以使用箭头函数语法,这提供了更简洁的代码和访问全局变量的能力,而不需要
use
。代码:(Demo)
i2byvkas7#
我可能会这样做:
vddsk6oq8#
yshpjwxd9#
您可以执行以下操作:
或: