PHP>

2 Cevap

Tamam, temelde, bir veri seti tüm mükemmel benim veri yapısı kriteri döndüren bir mySQL sorgu oluşturmuşlardır. Bunu ilan etmek olsaydı, bu gibi bir şey olacaktır:

$arr = array(
        array( 'name' => 'Root', 'depth' => 0 ),
        array( 'name' => 'Food', 'depth' => 0 ),
        array( 'name' => 'Fruit', 'depth' => 1 ),
        array( 'name' => 'Bannnanna', 'depth' => 2 ),
        array( 'name' => 'Apple', 'depth' => 2 ),
        array( 'name' => 'Bannnanna', 'depth' => 2 ),
        array( 'name' => 'Meat', 'depth' => 1 ),
        array( 'name' => 'Furniture', 'depth' => 0 )
        );

Ne istiyorum, ben o zamanlar çok boyutlu bir dizi olsun böylece bir yöntem haline bu $ dizi beslemektir.

For instance, Fruit would be a child of Food. And Bananana would be a child of Fruit. I need the keys of each 'child' to be 'pages'.

Yukarıda gösterdi dizisi aynı zamanda 'LFT' ve 'rgt' olarak diğer bilgi dönebilirsiniz. Ben 'parentId' set yok ama gerekirse benim modelini değiştirebilir, ama ben iç içe Seti Modeli ile sopa tercih ederim.

2 Cevap

Aşağıdaki kodu değerleri sırası ve derinliği doğru olduğunu varsayar. Bu tuşları kullanarak çiftleri kaldırır unutmayın.

 header('Content-Type: text/plain');

 $arr = array(
     array( 'name' => 'Root', 'depth' => 0 ),
     array( 'name' => 'Food', 'depth' => 0 ),
     array( 'name' => 'Fruit', 'depth' => 1 ),
     array( 'name' => 'Bannnanna', 'depth' => 2 ),
     array( 'name' => 'Apple', 'depth' => 2 ),
     array( 'name' => 'Bannnanna', 'depth' => 2 ),
     array( 'name' => 'Meat', 'depth' => 1 ),
     array( 'name' => 'Furniture', 'depth' => 0 )
 );

 function process( &$arr, &$prev_sub = null, $cur_depth = 0 ) {
  $cur_sub = array();
  while( $line = current( $arr ) ) {
   if( $line['depth'] < $cur_depth ) {
    return $cur_sub;
   } elseif( $line['depth'] > $cur_depth ) {
    $prev_sub = process( $arr, $cur_sub, $cur_depth + 1 );
   } else {
    $cur_sub[$line['name']] = $line['name'];
    $prev_sub =& $cur_sub[$line['name']];
    next( $arr );
   }
  }
  return $cur_sub;
 }

 $values = process( $arr );
 print_r( $values );

Çıktı:

 Array
 (
     [Root] => Root
     [Food] => Array
         (
             [Fruit] => Array
                 (
                     [Bannnanna] => Bannnanna
                     [Apple] => Apple
                 )
             [Meat] => Meat
         )
     [Furniture] => Furniture
 )

Böyle bir şey belki

			$arr = array(
			        array( 'name' => 'Root', 'depth' => 0 ),
			        array( 'name' => 'Food', 'depth' => 0 ),
			        array( 'name' => 'Fruit', 'depth' => 1 ),
			        array( 'name' => 'Bannnanna', 'depth' => 2 ),
			        array( 'name' => 'Apple', 'depth' => 2 ),
			        array( 'name' => 'Bannnanna', 'depth' => 2 ),
			        array( 'name' => 'Meat', 'depth' => 1 ),
			        array( 'name' => 'Furniture', 'depth' => 0 )
			        );

			$p = array(array());
			foreach($arr as $n => $a) {
				$d = $a['depth'] + 1;
				$p[$d - 1]['children'][] = &$arr[$n];
				$p[$d] = &$arr[$n];
			}

			print_r($p[0]);