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

  //C# 2.0
  RemoveAll(delegate(Foo o){ return o.X >= 10; });

или

  //C# 3.0
  RemoveAll(o => o.X >= 10);

или

  Predicate<Foo> matches = delegate(Foo o){ return o.X >= 10; });
  //or Predicate<Foo> matches = o => o.X >= 10;
  RemoveAll(matches);
24
задан dreftymac 29 November 2017 в 15:33
поделиться

6 ответов

$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";
}
49
ответ дан 28 November 2019 в 22:22
поделиться

Вы можете перебирать копии ключей, чтобы иметь возможность использовать 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;
    }
}
3
ответ дан 28 November 2019 в 22:22
поделиться
  foreach ($aray as $key => $value) {
    if (2 != $value) {
      unset($array($key));
    }
  }

  echo 'Items in array:' . count($array);
0
ответ дан 28 November 2019 в 22:22
поделиться

Я мог бы сделать что-нибудь вроде:

$newarray = array();
foreach ($jsonarray as $testelement){
    if ($testelement == 2){$newarray[]=$testelement}
}
$result = count($newarray);
-1
ответ дан 28 November 2019 в 22:22
поделиться

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

Циклы в то время как / для / foreach метод

Цикл по вашему массиву с любым циклом, который вы хотите, может это будет , а , для или foreach . Затем просто проверьте свое условие и либо unset () элементы, если они не соответствуют вашему условию, либо запишите элементы, соответствующие условию, в новый массив.

Looping

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

Просто поместите свое условие в цикл, где находится комментарий // 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 () method

Другой метод - использовать 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 () method

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
24
ответ дан 28 November 2019 в 22:22
поделиться

This should work, but I'm not sure how efficient it is as you probably end up copying a lot of data.

$newArray = array_intersect_key(
                  $fullarray, 
                  array_flip(array_keys($fullarray, 2))
            );
2
ответ дан 28 November 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: