Как фильтровать массив по условию

У меня такой массив:

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

Теперь я хочу отфильтровать этот массив по некоторому условию и сохранить только те элементы, где значение равно 2, и удалить все элементы, где значение NOT 2.

Таким образом, мой ожидаемый массив результатов:

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

Примечание. Я хочу сохранить ключи из исходного массива.

Как я могу это сделать с PHP? Любые встроенные функции?

Related of "Как фильтровать массив по условию"

 $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"; } 

Вам как-то придется проходить через ваш массив и фильтровать каждый элемент по вашему состоянию. Это можно сделать различными способами.

Циклы while / for / foreach

Петля через массив с любым циклом, который вы хотите, может быть, while , for или for foreach . Затем просто проверьте свое состояние и либо 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 comment //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 } с //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() похож на array_filter() только на то, что он использует регулярное выражение для фильтрации массива. Таким образом, вы не сможете делать все с этим, так как вы можете использовать только регулярное выражение в качестве фильтра, и вы можете фильтровать только значениями или с помощью некоторого кода.

Также обратите внимание, что вы можете передать флаг 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]); } } с foreach (array_keys($array) as $key) { if ($array[$key] != 2) { unset($array[$key]); } } 

Преимуществом этого метода является эффективность памяти, если массив содержит большие значения – они не дублируются.

EDIT Я только заметил, что вам нужны только ключи, которые имеют значение 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 .

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