Есть массив, многоуровневый (может быть 3 уровня, может 7) Важно найти на каком-бы то не было уровне элемент с ключом "audiofile" и передать его содержимое в другой массив через array_push, например Причем если элементов с таким ключом несколько, то в финальный массив должны попасть все Элементы могут находиться на разных уровнях, если их несколько
Функция
/**
* @param string $searchKey Ключ который ищим
* @param array $arr Массив в котором ищем
* @param array $result Массив в который будет складываться результат (передается по ссылке)
*/
function search_key($searchKey, array $arr, array &$result)
{
// Если в массиве есть элемент с ключем $searchKey, то ложим в результат
if (isset($arr[$searchKey])) {
$result[] = $arr[$searchKey];
}
// Обходим все элементы массива в цикле
foreach ($arr as $key => $param) {
// Если эллемент массива есть массив, то вызываем рекурсивно эту функцию
if (is_array($param)) {
search_key($searchKey, $param, $result);
}
}
Пример использования
// Результат
$result = [];
// Данные для теста
$arr = [
'a' => 10,
'b' => 20,
'c' => [
'x' => 10,
'y' => 20,
'z' => [
'audiofile' => 'file://file1.mp3',
'f' => null,
'g' => [
'audiofile' => 'file://file2.mp3'
],
]
],
];
search_key('audiofile', $arr, $result);
var_dump($result);
Как вариант можно воспользоваться итератором:
<?php
$candidate = [
'a' => 10,
'b' => 20,
'c' => [
'x' => 10,
'y' => 20,
'z' => [
'audiofile' => 'file://file1.mp3',
'f' => null,
'g' => [
'audiofile' => 'file://file2.mp3'
],
]
],
];
$result = [];
// Iteration on leafs AND nodes
foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($candidate), RecursiveIteratorIterator::LEAVES_ONLY) as $key => $value) {
if ('audiofile' === $key) {
$result[] = $value;
}
}
var_dump($result);
Сайт на LaravelЕсть удаленное подключение в mysql бд на windows, которое исправно работает