Я храню бесконечно вложенную структуру каталогов в mysql, назначая «parent_album_id» каждому «альбому» (если только он не находится на верхнем уровне, в этом случае у него нет parent_album_id).
Сначала я извлекаю массив всех альбомов из базы данных и заменяю ключ каждого альбома на его «id» (идентификатор автоинкремента).
Далее, я хочу реорганизовать массив альбомов в многомерный массив, сохраняя дочерние альбомы в 'children' для каждого альбома. У меня был некоторый успех. Следующий код работает нормально, если мне нужно перейти только на один уровень в массиве, но если я перейду более чем на один уровень, он потеряет всю структуру массива. Это потому, что когда я рекурсивно вызываю array_search_key, я не передаю полный массив, просто следующий уровень, который я хочу найти.
Как мне выполнить рекурсивный поиск по массиву, но вернуть весь многомерный массив альбомов?
foreach ($albums as &$album){
if($album['parent_album_id']){ // Move album if it has a parent
$insert_album = $album;
unset($albums[$album['id']]); // Remove album from the array, since we are going to insert it into its parent
$results = array_search_key($album['parent_album_id'],$albums,$insert_album, $albums);
if($results){
$albums = $results;
}
}
}
function array_search_key( $needle_key, $array , $insert_album) {
foreach($array AS $key=>&$value){
if($key == $needle_key) {
$array[$key]['children'][$insert_album['id']] = $insert_album;
return $array;
}
if(is_array($value) && is_array($value['children'])){
if( ($result = array_search_key($needle_key, $value['children'], $insert_album)) !== false)
return $result;
}
}
return false;
}