【问题标题】:PHP arrays building treePHP数组构建树
【发布时间】:2021-10-19 23:16:28
【问题描述】:

这里的数组索引是父 ID。 0 是索引 0 内的顶级父级包含子类别,并且子在整个数组中的索引键中具有子:

array (
  0 => 
  array (
    190 => 'Adana',
    58 => 'Ankara',
    199 => 'Antalya',
    205 => 'Aydın',
    226 => 'Kocaeli',
    228 => 'Mersin',
    233 => 'Nevşehir',
    236 => 'Sakarya',
    57 => 'İstanbul',
    56 => 'İzmir',
  ),
  57 => 
  array (
    420 => 'Anadolu Yakası',
    419 => 'Avrupa Yakası',
  ),
  419 => 
  array (
    158 => 'Avcılar',
    86 => 'Bahçelievler',
    160 => 'Bakırköy',
    87 => 'Bayrampaşa',
    161 => 'Başakşehir',
    162 => 'Beylikdüzü',
    163 => 'Beyoğlu',
    89 => 'Beşiktaş',
    164 => 'Büyükçekmece',
    503 => 'Esenyurt',
    95 => 'Eyüp',
    167 => 'Fatih',
    501 => 'Gaziosmanpaşa',
    96 => 'Güngören',
    422 => 'Kağıthane',
    176 => 'Küçükçekmece',
    103 => 'Sarıyer',
    542 => 'Silivri',
    508 => 'Sultangazi',
    189 => 'Zeytinburnu',
    105 => 'Şişli',
  ),
  420 => 
  array (
    172 => 'Adalar',
    85 => 'Ataşehir',
    90 => 'Beykoz',
    421 => 'Kadıköy',
    98 => 'Kartal',
    100 => 'Maltepe',
    102 => 'Pendik',
    536 => 'Tuzla',
    77 => 'Çekmeköy',
    187 => 'Ümraniye',
    107 => 'Üsküdar',
    104 => 'Şile',
  ),
  56 => 
  array (
    123 => 'Alsancak',
    215 => 'Balçova',
    124 => 'Bayraklı',
    125 => 'Bornova',
    216 => 'Buca',
    617 => 'Dikili',
    217 => 'Foça',
    218 => 'Gaziemir',
    220 => 'Güzelbahçe',
    507 => 'Karabağlar',
    128 => 'Karşıyaka',
    535 => 'Kemalpaşa',
    130 => 'Konak',
    222 => 'Menemen',
    132 => 'Narlıdere',
    223 => 'Seferihisar',
    559 => 'Tire',
    489 => 'Torbalı',
    225 => 'Urla',
    126 => 'Çeşme',
    127 => 'Çiğli',
  ),
  58 => 
  array (
    263 => 'Akyurt',
    428 => 'Altındağ',
    483 => 'Dikmen',
    116 => 'Etimesgut',
    117 => 'Gölbaşı',
    735 => 'Kahramankazan',
    459 => 'Keçiören',
    119 => 'Mamak',
    462 => 'Polatlı',
    120 => 'Pursaklar',
    430 => 'Sincan',
    122 => 'Yenimahalle',
    114 => 'Çankaya',
    453 => 'Çubuk',
    619 => 'Ümitköy',
  ),
  89 => 
  array (
    84 => 'Levent',
  ),
  117 => 
  array (
    520 => 'Kızılcaşar',
    195 => 'İncek',
  ),
  226 => 
  array (
    227 => 'Başiskele',
    625 => 'Gebze',
    667 => 'Kartepe',
  ),
  215 => 
  array (
    387 => 'İnciraltı',
  ),
  103 => 
  array (
    607 => 'Kilyos',
    178 => 'Maslak',
    106 => 'Tarabya',
  ),
  122 => 
  array (
    113 => 'Batıkent',
    198 => 'Ostim',
  ),
  216 => 
  array (
    129 => 'Kaynaklar',
  ),
  205 => 
  array (
    207 => 'Efeler',
    658 => 'Kuşadası',
    208 => 'Merkez',
  ),
  114 => 
  array (
    537 => 'Gaziosmanpaşa',
    118 => 'Kavaklıdere',
    197 => 'Söğütözü',
    115 => 'Çayyolu',
    623 => 'Çukurambar',
  ),
  100 => 
  array (
    177 => 'Küçükyalı',
    173 => 'İdealtepe',
  ),
  160 => 
  array (
    169 => 'Florya',
  ),
  163 => 
  array (
    524 => 'Karaköy',
  ),
  218 => 
  array (
    517 => 'Sarnıç',
  ),
  190 => 
  array (
    192 => 'Adnan Menderes',
    193 => 'Pozantı',
  ),
  96 => 
  array (
    602 => 'Merter',
  ),
  199 => 
  array (
    202 => 'Kaleiçi',
  ),
  228 => 
  array (
    230 => 'Merkez',
  ),
  126 => 
  array (
    544 => 'Dalyan',
  ),
  233 => 
  array (
    235 => 'Ürgüp',
  ),
  116 => 
  array (
    530 => 'Eryaman',
  ),
  236 => 
  array (
    237 => 'Sapanca',
  ),
  95 => 
  array (
    175 => 'Kemerburgaz',
  ),
  421 => 
  array (
    168 => 'Fenerbahçe',
  ),
  107 => 
  array (
    526 => 'Çamlıca',
  ),
  90 => 
  array (
    174 => 'Kavacık',
  ),
)

示例:Array[0] 包括索引键 57:即伊斯坦布尔。在数组索引键 57 中包含伊斯坦布尔的子类别,索引 420“Avrupa Yakası”是伊斯坦布尔的子类别,它在数组中列出了子类别。 我需要像这样从 Array[0] 构建一棵树

İstanbul
 Avrupa Yakası
  Bahçelievler
 Anadolu Yakası
  Kadıköy
    Fenerbahçe
İzmir
 Alsancak

【问题讨论】:

  • 你有没有尝试过?

标签: php arrays tree


【解决方案1】:

如何将父类与子类分开并循环遍历它以查找父索引,例如;

function tree($array){
  //Hold the parents in one array to us as a lookup
  $parents = $array[0];

  //Copy the array and remove the [0] parent element to allow simple
  //looping through the sub-category elements
  unset($array[0]);

  //Define the output array
  $output = [];
  $lookup = [];

 //Loop through the parents to find their sub cats
 //Append any sub-cat children as sub-elements of the subcat

 foreach($parents as $index => $category){
   $output[$category] = array_fill_keys(array_values($array[$index]), null);
   $lookup[$category] = $array[$index];
   foreach($lookup[$category] as $catindex => $subcat){
     if(isset($array[$catindex])){
       $output[$category][$subcat] = array_fill_keys(array_values($array[$catindex]), null);
     };
   };
 };

  return $output;
}

Teh Playground 的工作示例给出以下输出;

Array
(
[Adana] => Array
    (
        [Adnan Menderes] => 
        [Pozantı] => 
    )

[Ankara] => Array
    (
        [Akyurt] => 
        [Altındağ] => 
        [Dikmen] => 
        [Etimesgut] => Array
            (
                [Eryaman] => 
            )

        [Gölbaşı] => Array
            (
                [Kızılcaşar] => 
                [İncek] => 
            )

        [Kahramankazan] => 
        [Keçiören] => 
        [Mamak] => 
        [Polatlı] => 
        [Pursaklar] => 
        [Sincan] => 
        [Yenimahalle] => Array
            (
                [Batıkent] => 
                [Ostim] => 
            )

        [Çankaya] => Array
            (
                [Gaziosmanpaşa] => 
                [Kavaklıdere] => 
                [Söğütözü] => 
                [Çayyolu] => 
                [Çukurambar] => 
            )

        [Çubuk] => 
        [Ümitköy] => 
    )

[Antalya] => Array
    (
        [Kaleiçi] => 
    )

[Aydın] => Array
    (
        [Efeler] => 
        [Kuşadası] => 
        [Merkez] => 
    )

[Kocaeli] => Array
    (
        [Başiskele] => 
        [Gebze] => 
        [Kartepe] => 
    )

[Mersin] => Array
    (
        [Merkez] => 
    )

[Nevşehir] => Array
    (
        [Ürgüp] => 
    )

[Sakarya] => Array
    (
        [Sapanca] => 
    )

[İstanbul] => Array
    (
        [Anadolu Yakası] => Array
            (
                [Adalar] => 
                [Ataşehir] => 
                [Beykoz] => 
                [Kadıköy] => 
                [Kartal] => 
                [Maltepe] => 
                [Pendik] => 
                [Tuzla] => 
                [Çekmeköy] => 
                [Ümraniye] => 
                [Üsküdar] => 
                [Şile] => 
            )

        [Avrupa Yakası] => Array
            (
                [Avcılar] => 
                [Bahçelievler] => 
                [Bakırköy] => 
                [Bayrampaşa] => 
                [Başakşehir] => 
                [Beylikdüzü] => 
                [Beyoğlu] => 
                [Beşiktaş] => 
                [Büyükçekmece] => 
                [Esenyurt] => 
                [Eyüp] => 
                [Fatih] => 
                [Gaziosmanpaşa] => 
                [Güngören] => 
                [Kağıthane] => 
                [Küçükçekmece] => 
                [Sarıyer] => 
                [Silivri] => 
                [Sultangazi] => 
                [Zeytinburnu] => 
                [Şişli] => 
            )

    )

[İzmir] => Array
    (
        [Alsancak] => 
        [Balçova] => Array
            (
                [İnciraltı] => 
            )

        [Bayraklı] => 
        [Bornova] => 
        [Buca] => Array
            (
                [Kaynaklar] => 
            )

        [Dikili] => 
        [Foça] => 
        [Gaziemir] => Array
            (
                [Sarnıç] => 
            )

        [Güzelbahçe] => 
        [Karabağlar] => 
        [Karşıyaka] => 
        [Kemalpaşa] => 
        [Konak] => 
        [Menemen] => 
        [Narlıdere] => 
        [Seferihisar] => 
        [Tire] => 
        [Torbalı] => 
        [Urla] => 
        [Çeşme] => Array
            (
                [Dalyan] => 
            )

        [Çiğli] => 
    )

每个最底层的子元素都为空并不是理想,但这是在不推断数字索引的情况下输出树形结构中的值的唯一方法,也简化了处理变量的代码每个顶级父元素的深度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    相关资源
    最近更新 更多