如何按条件过滤数组

我有一个这样的数组:

array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2) 

现在,我想通过某些条件来过滤该数组,并只保留其值等于2的元素,并删除值不为2的所有元素。

所以我的预期结果数组将是:

 array("a" => 2, "c" => 2, "f" => 2) 

注意:我想保留原始数组中的键。

我怎样才能做到这一点与PHP? 任何内置函数?

 $fullarray = array('a'=>2,'b'=>4,'c'=>2,'d'=>5,'e'=>6,'f'=>2); function filterArray($value){ return ($value == 2); } $filteredArray = array_filter($fullArray, 'filterArray'); foreach($filteredArray as $k => $v){ echo "$k = $v"; } 

你不知何故必须遍历你的数组,并通过你的条件筛选每个元素。 这可以用各种方法来完成。

循环/ for / foreach方法

用你想要的任何循环遍历你的数组,可能是whileforeachforeach 。 然后简单地检查你的条件,如果它们不符合你的条件,或者把符合条件的元素写入一个新的数组中,则将它们unset()

循环

 //while loop while(list($key, $value) = each($array)){ //condition } //for loop $keys = array_keys($array); for($counter = 0, $length = count($array); $counter < $length; $counter++){ $key = $keys[$counter]; $value = $array[$key]; //condition } //foreach loop foreach($array as $key => $value){ //condition } 

条件

只要将你的条件放入注释//condition所在的循环中即可。 条件可以检查任何你想要的,然后你可以unset()不符合你的条件的元素,如果你想要用array_values()重新索引数组,或者将元素写入一个满足条件。

 //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 } 

array_filter()方法

另一种方法是使用array_filter()内置函数。 它通常与简单循环的方法几乎相同。

如果要将元素保留在数组中,只需要返回TRUE如果要将元素从结果数组中删除,则只需返回FALSE

 //Anonymous function $newArray = array_filter($array, function($value, $key){ //condition }, ARRAY_FILTER_USE_BOTH); //Function name passed as string function filter($value, $key){ //condition } $newArray = array_filter($array, "filter", ARRAY_FILTER_USE_BOTH); //'create_function()', NOT recommended $newArray = array_filter($array, create_function('$value, $key', '/* condition */'), ARRAY_FILTER_USE_BOTH); 

preg_grep()方法

preg_grep()preg_grep()类似,只是它使用正则表达式来过滤数组。 所以你可能无法完成所有的工作,因为你只能使用正则表达式作为过滤器,而且你只能通过值来过滤或者通过一些更多的代码来进行过滤。

另外请注意,您可以传递标志PREG_GREP_INVERT作为第三个参数来反转结果。

 //Filter by values $newArray = preg_grep("/ regex /", $array); 

常见的情况

有许多常见的条件用于过滤所有可以应用于数组的值和或键的数组。 我将在这里列出其中的一些:

 // Odd values return $value & 1; // Even values return !($value & 1); // NOT null values return !is_null($value); // NOT 0 values return $value !== 0; // Contain certain value values return strpos($value, $needle) !== FALSE; //Use 'use($needle)' to get the var into scope // Contain certain substring at position values return substr($value, $position, $length) === $subString; // NOT 'empty'(link) values array_filter($array); //Leave out the callback parameter 

你可以迭代密钥的副本,以便能够在循环中使用unset()

 foreach (array_keys($array) as $key) { if ($array[$key] != 2) { unset($array[$key]); } } 

这个方法的好处是如果你的数组包含很大的值,那么这个方法的内存效率是非常高的。

编辑我只注意到,你实际上只需要具有值为2(你已经知道的价值)的键:

 $keys = array(); foreach ($array as $key => $value) { if ($value == 2) { $keys[] = $key; } } 

这应该工作,但我不知道它是多么高效,因为你可能最终复制大量的数据。

 $newArray = array_intersect_key( $fullarray, array_flip(array_keys($fullarray, 2)) ); 

我可能会做这样的事情:

 $newarray = array(); foreach ($jsonarray as $testelement){ if ($testelement == 2){$newarray[]=$testelement} } $result = count($newarray); 

查看array_filter页面上的array_filter

  foreach ($aray as $key => $value) { if (2 != $value) { unset($array($key)); } } echo 'Items in array:' . count($array);