Сортировка массива в многомерный массив на основе «parent_id» - PullRequest
2 голосов
/ 05 апреля 2010

Я храню бесконечно вложенную структуру каталогов в 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;
}

1 Ответ

1 голос
/ 05 апреля 2010
// you already managed to get the array into this form
$albums = array(
  1 => array('id'=>1, 'title'=>'Album 1', 'parentId'=>null),
  2 => array('id'=>2, 'title'=>'Album 2', 'parentId'=>null),
  3 => array('id'=>3, 'title'=>'Album 1.1', 'parentId'=>1),
  4 => array('id'=>4, 'title'=>'Album 1.1.1', 'parentId'=>3),
  5 => array('id'=>5, 'title'=>'Album 2.1', 'parentId'=>2),
  6 => array('id'=>6, 'title'=>'Album 1.1.2', 'parentId'=>3),
  7 => array('id'=>7, 'title'=>'Album 1.1.3', 'parentId'=>3)
);

print_r(foo($albums));


function foo($albums) {
  $rv = array();
  foreach( $albums as &$album) {
    if ( is_null($album['parentId']) ) {
      // no parentId -> entry in the root array
      $rv[] = &$album;
    }
    else {
      $pid = $album['parentId'];
      if ( !isset($albums[$pid]) ) {
        echo 'orphant album: ', $album['id'], "\n";
      }
      else {
        if ( !isset($albums[$pid]['children']) ) {
          $albums[$pid]['children'] = array();
        }
        $albums[$pid]['children'][] = &$album;
      }
    }
  }
  return $rv;
}

печать

Array
(
  [0] => Array
    (
    [id] => 1
    [title] => Album 1
    [parentId] => 
    [children] => Array
      (
        [0] => Array
        (
          [id] => 3
          [title] => Album 1.1
          [parentId] => 1
          [children] => Array
            (
            [0] => Array
              (
                [id] => 4
                [title] => Album 1.1.1
                [parentId] => 3
              )

            [1] => Array
              (
                [id] => 6
                [title] => Album 1.1.2
                [parentId] => 3
              )

            [2] => Array
              (
                [id] => 7
                [title] => Album 1.1.3
                [parentId] => 3
              )

            )

        )

      )

    )

  [1] => Array
    (
    [id] => 2
    [title] => Album 2
    [parentId] => 
    [children] => Array
      (
        [0] => Array
        (
          [id] => 5
          [title] => Album 2.1
          [parentId] => 2
        )

      )

    )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...