2010-11-18 15 views
0
Ben

PHP yeniden sıralama dizi üst/id hiyerarşisi

[0] => Array 
    (
     [id] => 1 
     [parent_id] => 0 
     [name] => Accueil 
    ) 

[1] => Array 
    (
     [id] => 2 
     [parent_id] => 0 
     [name] => Exposants 
    ) 

[2] => Array 
    (
     [id] => 3 
     [parent_id] => 0 
     [name] => Visiteurs 
    ) 

[3] => Array 
    (
     [id] => 4 
     [parent_id] => 0 
     [name] => Medias 
    ) 

[4] => Array 
    (
     [id] => 5 
     [parent_id] => 0 
     [name] => Activités 
    ) 

[5] => Array 
    (
     [id] => 6 
     [parent_id] => 1 
     [name] => Contact 
    ) 

[6] => Array 
    (
     [id] => 7 
     [parent_id] => 3 
     [name] => Partenaires 
    ) 

[7] => Array 
    (
     [id] => 8 
     [parent_id] => 2 
     [name] => News 
    ) 

Yani kimliği ve parent_id alanları tarafından gösterildiği gibi hiyerarşiyi yansıtan bir dizi ile gelip aşağıdaki diziyi yeniden düzenlemek nasıl

yansıtacak? Dizi anahtarı, dizi öğelerinin kimlik alanı ebeveyntir. Bu dizinin içinde her defasında anahtar olarak ID alanı olan bir alt dizidir. Örnek:

[1] => Array 
     (
      [name] => Accueil 
      [children] => array(
       [0] => bla, 
       [3]  => bla2 
      ) 
     ) 

    [2] => Array 
     (
      [name] => Something 
      [children] => array(
       [4] => bla3, 
      ) 
     ) 
+0

Ana dizideki tüm "kullanıcılara" sahipseniz, yalnızca kimlikleri bir anahtar/değer olarak almak yerine, yalnızca 'çocuklar' anahtarının altında saklamak mantıklı olmaz (değerin ad olduğu varsayılırsa) veya somesuch)? – Orbling

cevap

0

Bunu daha fazla DRY yapabilirsiniz, ancak bu işlemin hızlı ve kirli bir yoludur. Ayrıca, her çocuk kaydının geçerli bir üst kaydı olduğunu ve geçerli ana kaydın orijinal dizideki alt kayıttan önce geleceğini garanti ederseniz 6 satırı kaldırabilirsiniz.

$sorted = array(); 
foreach($orig_ary as $item) { 
    if ($item['parent_id'] === 0) { 
    if (!array_key_exists($item['id'], $sorted)) { 
     $sorted[ $item['id'] ] = array(
     'name' => '', 
     'children' => array() 
    ); 
    } 
    $sorted[ $item['id'] ]['name'] = $item['name']; 
    } else { 
    if (!array_key_exists($item['parent_id'], $sorted)) { 
     $sorted[ $item['parent_id'] ] = array(
     'name' => '', 
     'children' => array() 
    ); 
    } 
    $sorted[ $item['parent_id'] ]['children'][ $item['id'] ] = $item['name']; 
    } 
} 
2

herhangi derinliği İşleri ve çocukların ebeveynleri önce sağlar: $nodes sonucu

<?php 
$p = array(0 => array()); 
foreach($nodes as $n) 
{ 
    $pid = $n['parent_id']; 
    $id = $n['id']; 

    if (!isset($p[$pid])) 
    $p[$pid] = array('child' => array()); 

    if (isset($p[$id])) 
    $child = &$p[$id]['child']; 
    else 
    $child = array(); 

    $p[$id] = $n; 
    $p[$id]['child'] = &$child; 
    unset($p[$id]['parent_id']); 
    unset($child); 

    $p[$pid]['child'][] = &$p[$id];  
} 
$nodes = $p['0']['child']; 
unset($p); 
?> 

kullanın var_dump yapısını görmek için. Önerdiğin şeye yakın. En önemli fark, anahtarların kimlikler olmamasıdır.