Фильтровать массив с заданными условиями

#php #arrays #array-filter

#php #массивы #массив-фильтр

Вопрос:

У меня есть такой большой массив:

 [
"id" : "100",
"uuid": "7594873",
"parameters" => [
    "type" => "fast",
    "height" => "140"]
],[
"id" : "101"
"uuid": "7594872"
"parameters" => [
    "type" => "slow",
    "height" => "140"]
],[
"id" : "102",
"uuid": "7594875",
"parameters" => [
    "type" => "fast",
    "height" => "120"]
],[
"id" : "114",
"uuid": "7294876",
"parameters" => [
    "type" => "fast",
    "height" => "125",]
],[
"id" : "115",
"uuid": "7294123",
"parameters" => [
    "type" => "fast",
    "height" => "120",
    ]
]
 

Я хотел бы вернуть (в PHP 7) указанный результат с условием того же параметра типа, что и родительский, и указанной высоты, равной «120».

В этом примере результат массива должен быть:

[«7594873» => [«7594875», «7294123»]]

Должен ли я использовать array_filter? У меня 100 000 записей в массиве, и я хочу выполнить поиск как можно быстрее.

Комментарии:

1. Как вы узнаете, какие записи являются родительскими, а какие дочерними?

2. Также было бы полезно, если бы вы использовали var_export для вывода своих выборочных данных; тогда его можно будет прочитать непосредственно как PHP для целей тестирования.

3. foreach выполняется быстрее, чем array_filter, потому что array_filter использует функцию закрытия.

4. так, может быть, array_search с array_column ?

Ответ №1:

Решение с помощью простого foreach, который создает новый массив:

 $type = $arr[0]['parameters']['type']; //or what is parent type ?

$result = [];
foreach($arr as $key => $row){
  if($row['parameters']['type'] != $type) continue;
  if($row['parameters']['height'] != 120) continue;
  if($row['id'] <= 100) continue;
  $result[$key] = $row;
}
 

С помощью continue оставшаяся часть текущей итерации цикла пропускается в структурах цикла, и затем выполнение продолжается со следующей итерацией.

Результат:

 array (
  2 => 
  array (
    'id' => "102",
    'uuid' => "7594875",
    'parameters' => 
    array (
      'type' => "fast",
      'height' => "120",
    ),
  ),
  4 => 
  array (
    'id' => "115",
    'uuid' => "7294123",
    'parameters' => 
    array (
      'type' => "fast",
      'height' => "120",
    ),
  ),
)