В настоящее время я схожу с ума от того, как это сделать, по сути, у меня есть многомерный массив, и мне нужен код для проверки всех значений и наличия значения во всех массивах, а не для возврата результата.
Родители visitPoints,острова,животные всегда будут существовать, хотя иногда и пустые, столбцы второго уровня являются динамическими, поэтому изменяются ключи 20,35,57 и их содержимое.
$array = [
'visitPoints'=>[
20=>[2,5,6,8,10,11],
35=>[2,5,6],
57=>[1],
],
'islands'=>[
20=>[5,10,11],
35=>[5,6]
],
'animals'=>[
20=>[5,11],
35=>[]
]
];
И результат, который я ищу, таков:
$result = [
20=>[5,11],
35=>[],
57=>[]
];
играл с call_user_func_array('array_intersect', $array), но не смог получить искомый результат.
Вот пример ссылки: https://3v4l.org/meX5p
@ADyson попробовал некоторые варианты в автономном режиме, но ими не стоит делиться, поскольку они не имеют смысла.
Будут ли все столбцы всегда существовать во всех массивах? Можем ли мы всегда быть уверены, что столбцы второго уровня будут доступны (например, 20 и 35)?
Всегда ли известна глубина? Всегда ли структура одинакова?
то, что всегда будет существовать, - это родительские точки посещения, острова, животные, хотя иногда они пусты, столбцы второго уровня являются динамическими, поэтому ключи 20,35 меняются и их содержимое.






Возможно, что-то вроде этого? Проверьте это здесь.
$array = [
'visitPoints'=>[
20=>[2,5,6,8,10,11],
35=>[2,5,6]
],
'islands'=>[
20=>[5,10,11],
35=>[5,6]
],
'animals'=>[
20=>[5,11],
35=>[]
]
];
function checkExisting($arr) {
$result = [];
$pass = 0;
foreach($arr as $firstLvlKey=>$firstLvlArray) {
$pass++;
foreach($firstLvlArray as $secondLvlKey=>$secondLvlArray) {
if ($pass === 1) {
$result[$secondLvlKey] = $secondLvlArray;
} else {
$result[$secondLvlKey] = array_intersect($result[$secondLvlKey],$secondLvlArray);
}
}
}
return $result;
}
print_r(checkExisting($array));
РЕДАКТИРОВАТЬ
Я заметил, что при этом будут сохранены индексы третьего уровня исходного массива (в данном случае индексы 1 и 5). Если вы не возражаете против этого, вы можете использовать приведенный пример. Если вам нужно сбросить индексы (т. е. 0 => 5, 1=> 11 и т. д.), вы можете сделать что-то вроде этого:
$array = [...];
function checkExisting($arr) {
$result = [];
$pass = 0;
foreach(...) {
$pass++;
foreach(...) {
if ($pass === 1) {
$result[$secondLvlKey] = $secondLvlArray;
} else {
// the part below matters - wrap everything in array_values(...)
$result[$secondLvlKey] = array_values(array_intersect($result[$secondLvlKey],$secondLvlArray);)
}
}
}
return $result;
}
print_r(checkExisting($array));
Изолируйте первое подмножество и примените его к результату, затем повторите оставшиеся подмножества, следуя ключам результирующего массива, и отфильтруйте соответствующие строки с возвратом к пустому массиву, когда строка результата не найдена для соответствующего ключа. (Демо)
$result = array_shift($array) ?? [];
foreach ($array as $rows) {
foreach ($result as $k => $row) {
$result[$k] = array_values(array_intersect($row, $rows[$k] ?? []));
}
}
var_export($result);
Я включу в результат нулевое объединение на случай, если входной массив пуст.
любой шанс, что мы можем обусловить, что ключ отсутствует во всех 3, чтобы не возвращать его, вот пример 3v4l.org/VS2LE ключ 57 отображается только в точках посещения, а не в остальных, поэтому он недействителен и его следует игнорировать.
Это было моей первоначальной заботой. Я обновлю свой ответ после того, как вы обновите свой вопрос. Может ли уникальный ключ быть найден только в более позднем подмассиве? Чем сложнее ваш минимально воспроизводимый пример , тем лучше будут ответы.
Я ценю ваше время и помощь.
могу ли я заменить $result[$k] на $row?
Да, извини, хороший улов. Я почистил свой фрагмент.
Что вы пробовали? Где ты застрял? См. также Как задавать и как составить минимально воспроизводимый пример вашей проблемы.