"Parent_id" dayalı çok boyutlu bir diziye bir dizi sıralama

1 Cevap php

(Bir parent_album_id yok bu durumda, en üst düzeyde olmadığı sürece) Her "albümü için" bir "parent_album_id" atayarak mysql bir sonsuz iç içe dizin yapısını saklamak ediyorum.

Ben ilk "id" (değiştirmemesi id) Neler için veritabanındaki tüm albümlerin bir dizi kapmak ve her albümleri anahtarını değiştirmek.

Sonra, ben her albüm için 'çocuk' çocuk albümleri saklamak, multidemensional diziye albümlerin dizi yeniden düzenlemek istiyorum. Bazı başarı elde ettik. Ben sadece dizide bir seviye aşağı gitmek gerekiyorsa aşağıdaki kod çalışıyor, ama daha fazla bir seviye aşağı gitmek eğer dizinin tam yapısını kaybeder. Ben yinelemeli array_search_key çağırdığınızda ben aramak istiyorum tam bir dizi, hemen bir sonraki seviyeye geçemiyor çünkü bu.

Nasıl yinelemeli dizi arama, ancak albüm tüm boyutlu dizi dönebilirsiniz?

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 Cevap

// 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;
}

baskılar

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
        )

      )

    )

)