2016-03-25 26 views
0

Farlow gibi bir dizilim var. Dizideki ikinci değer seviye/derinliktir. Satırda Satıra Göre Yerleştirme Dizisi

$arr = array(
    ['product 1', 0], 
    ['product 2', 1], 
    ['product 3', 1], 
    ['product 4', 2], 
    ['product 5', 0] 
); 

görsel olarak temsil etmek:

product 1 
    product 2 
    product 3 
     product 4 
product 5 

bu dönüştürmek çalışıyorum:

Array 
(
    [0] => Array 
     (
      [0] => product 1 
      [1] => 0 
      [children] => Array 
       (
        [0] => Array 
         (
          [0] => product 2 
          [1] => 1 
         ) 

        [1] => Array 
         (
          [0] => product 3 
          [1] => 1 
          [children] => Array 
           (
            [0] => product 4 
            [1] => 2 
           ) 
         ) 
       ) 
     ) 
    [1] => Array 
     (
      [0] => product 5 
      [1] => 0 
     ) 

) 

sınırsız seviyeleri ile.

Neredeyse tüm gün boyunca kafamı duvara çarptı ve çözüm için yaklaşmadım bile. Sinir bozucu olarak, kendi başıma bir şeyleri çözememek olduğu için, yenilgiyi itiraf etmeliyim. Gösterilecek yararlı bir kodum yok. Bunun temelde kod sorduğunu biliyorum ama bu benim beyin gücümün ötesinde. Eğer kimse biraz meydan okuma için uygunsa bu olabilir :). Çok minnettar olurum.

Teşekkür ederiz.

+0

Anlamadığım tek şey ise: 'Dizi ( [0] => ürün 5 [1] => 1 ) niçin ikinci elemanın 1 değeri burada? Yanlış mı yazdınız? Ayrıca neyi temsil etmeli? Derinlik? – Rizier123

+0

Bu kayıtlar veritabanından veya bir rastgele? Her kayıt için bir kimliğiniz var mı? – Veniamin

+1

ne başlangıç ​​dizisi $ arr = dizi (['ürün 5', 0], ['ürün 2', 2], ['ürün 4', 1], ['ürün 3', 2], ['ürün 1', 0]); '? Böyle bir durumda beklenen "dönüşüm" çıktısına nasıl bakılmalıdır? – RomanPerekhrest

cevap

1

İhtiyaçınızı karşılamak için ilk diziyi bir seviye daha uzattım - "Sınırsız düzeylerde."
Ve burada findParent denilen özyinelemeli fonksiyonu ile çözüm:

$arr = array(
    ['product 1', 0], 
    ['product 2', 1], 
    ['product 3', 1], 
    ['product 4', 2], 
    ['product 5', 3], 
    ['product 6', 3], 
    ['product 7', 0], 
    ['product 8', 1], 
); 

$structure = []; 
foreach ($arr as $k => $v) { 
    if (empty($structure) || $v[1] == 0) { 
     $structure[] = $v; 
    } else { 
     $last = array_pop($structure); 
     $current_key = $k; 
     $parent_key = ""; 

     while (--$current_key) { 
      if ($v[1] > $arr[$current_key][1]) { 
       $parent_key = $arr[$current_key][0]; 
       break; 
      } 
     } 

     if ($v[1] == 1) { 
      (isset($last['children']))? $last['children'][] = $v : $last['children'] = [$v]; 
     } else { 
      findParent($last['children'], $parent_key, $v); 
     } 
     array_push($structure, $last); 
    } 
} 

function findParent(&$el = [], $parent_key = "", $child = []){ 
    foreach ($el as &$v) { 
     if ($v[0] == $parent_key) { 
      (isset($v['children']))? $v['children'][] = $child : $v['children'] = [$child]; 
      break; 
     } elseif (isset($v['children'])) { 
      findParent($v['children'], $parent_key, $child); 
     } 
    }  
} 

print_r($structure); 

çıkışı:

Array 
(
    [0] => Array 
     (
      [0] => product 1 
      [1] => 0 
      [children] => Array 
       (
        [0] => Array 
         (
          [0] => product 2 
          [1] => 1 
         ) 

        [1] => Array 
         (
          [0] => product 3 
          [1] => 1 
          [children] => Array 
           (
            [0] => Array 
             (
              [0] => product 4 
              [1] => 2 
              [children] => Array 
               (
                [0] => Array 
                 (
                  [0] => product 5 
                  [1] => 3 
                 ) 

                [1] => Array 
                 (
                  [0] => product 6 
                  [1] => 3 
                 ) 
               ) 
             ) 
           ) 
         ) 
       ) 
     ) 

    [1] => Array 
     (
      [0] => product 7 
      [1] => 0 
      [children] => Array 
       (
        [0] => Array 
         (
          [0] => product 8 
          [1] => 1 
         ) 
       ) 
     ) 
) 
+0

Hey, çabalarınız için teşekkürler! Yine de büyük bir sorun var. Bu diziye koymaya çalışın: $ arr = dizi ( ['ürün 1', 0], ['ürün 2', 1], ['ürün 3', 1], ['ürün 4', 2 ], ['ürün 5', 3], ['ürün 6', 3], ['ürün 7', 0], ['ürün 8', 1] ); 'ürün 5' ve 'ürün 6', 'ürün 2' ve 'ürün 3' gibi kardeşler olmalıdır. – Ivannnnn

+0

@Ivannnnn, buna "büyük bir sorun" demezdim. Güncelleştirmelerime bakın – RomanPerekhrest

+0

Fantastic! Çok teşekkürler Roma, kıçımı kurtardın. Tam olarak yaklaşık 12 saat boyunca elde ettiğim şeydi ve lolemedim. Merakla, böyle bir şey yazman ne kadar sürer? – Ivannnnn

0

Ben girişin daha iyi yapı olacağını düşünüyorum (bir kimliğinin olması halinde):

$arr = array(
    ['id' => 1, 'name' => 'product 1', 'cid' => 0, 'level' => 0], 
    ['id' => 2, 'name' => 'product 2', 'cid' => 1, 'level' => 1], 
    ['id' => 3, 'name' => 'product 3', 'cid' => 2, 'level' => 2], 
    ['id' => 4, 'name' => 'product 4', 'cid' => 3, 'level' => 3], 
    ['id' => 5, 'name' => 'product 5', 'cid' => 0, 'level' => 0] 
); 

cid - ebeveyn öğenin kimliği

$tree = []; 
foreach($arr as $item){ 
    $tree[ $item['level'] ][ $item['cid'] ][] = $item; 
} unset($item); 

Recursive fonksiyon çıkış ağacına

function echoTree($tree, $level = 0, $parent = 0, $prefix = ''){ 
    $level = intval($level); 
    $parent= intval($parent); 

    if(isset($tree[ $level ][ $parent ])){ 
     foreach($tree[ $level ][ $parent ] as $item){ 
      echo "{$prefix}{$item['name']}"; 
      echoTree($tree, $level + 1, $item['id'], $prefix.'---'); 
     } 
    } 
} 

Deneyin, ama ben test etmedim

+0

Hayır, sanırım aradığım şey bu değil. Yeni bir akılla yarın daha yakından bakacağız. Evet, önce bir ebeveyn kimliğini tanıtırsam daha kolay olabilir. BTW'yi reddetmedim. – Ivannnnn

İlgili konular