#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",
),
),
)