Как бороться с вложенными массивами? - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь распечатать вложенный список со структурой <ul><li>, но сначала мне нужно правильно упорядочить свои данные. Я пытаюсь сделать это с помощью многомерных массивов, но я думаю, что мне нужен рекурсивный код. На самом деле я делаю это:

function array_key_exists_recursive(array $arr, $key) {
if (array_key_exists($key, $arr)) {
    return true;
}
foreach ($arr as $element) {
    if (is_array($element)) {
        if (array_key_exists_recursive($element, $key)) {
            return true;
        }
    }  
}
return false;
}

$tags = array();
            foreach($gallery as $gg){
                $ftg = $gg['ftag']; //father category
                $tg = $gg['tag']; //category
                    if(array_key_exists($ftg , $tags)) {
                        if(!in_array($tg, $tags[$ftg])) {
                            $tags[$ftg][$tg] = null;
                        }
                    }
                    else { 
                        if(array_key_exists_recursive($tags, $ftg)) {
                            foreach($tags as $t=>$v) {
                                if(array_key_exists($ftg, $v)) {
                                    $tags[$t][$ftg]= $tg;
                                }; 
                            }
                        }
                        else $tags[$ftg][$tg] = null;
                    }
                }

Очевидно, что работает только со структурами данных 2-го уровня и отличается от того, что мне нужно .. Кто-то знает, как заставить этот код работать?

Обновить : извините, что не добавляю массив данных, я публикую небольшой пример здесь:

$gallery = array (
    '0' => array (
            'post-id' => 2,
            'id' => 711,
            'url' => 'http://localhost/wp-content/uploads/2019/12/WhatsApp-Video-2019-10-11-at-09.42.44.mp4',
            'type' => 'video',
            'album' => 'UNO',
            'ftag' => 'Prova',
            'tag' => 'Categoria di Prova',
            'date' => '12/14/19'
        ),

    '1' => array (
            'post-id' => 2,
            'id' => 341,
            'url' => 'http://localhost/wp-content/uploads/2019/07/VID-20180925-WA0025.mp4',
            'type' => 'video',
            'album' => 'DUE',
            'ftag' => 'Prova',
            'tag' => 'Categoria dei Video',
            'date' => '07/13/19'
        ),

    '2' => array (
            'post-id' => 2,
            'id' => 614,
            'url' => 'http://localhost/wp-content/uploads/2019/12/2-10-scaled.jpg',
            'type' => 'image',
            'album' => 'TRE',
            'ftag' => 'Foto',
            'tag' => 'Categoria delle foto',
            'date' => '12/09/19',
            'thumb' => 'http://localhost/wp-content/uploads/2019/12/thumb_400_2-10-scaled.jpg'
        ),

    '3' => array (
            'post-id' => 2,
            'id' => 736,
            'url' => 'http://localhost/wp-content/uploads/2020/01/iconfinder_camera-shutter_353402.png',
            'type' => 'image',
            'album' => 'QUATTRO',
            'ftag' => 'Categoria delle foto',
            'tag' => 'Categoria delle icone',
            'date' => '01/29/20',
            'thumb' => 'http://localhost/wp-content/uploads/2020/01/thumb_400_iconfinder_camera-shutter_353402.png'
        ),

    '4' => array
        (
            'post-id' => 2,
            'id' => 744,
            'url' => 'http://localhost/wp-content/uploads/2020/02/DSC_0102-scaled.jpg',
            'type' => 'image',
            'album' => 'Titolo dell album',
            'ftag' => 'Categoria delle icone',
            'tag' => 'Terzo livello',
            'date' => '02/03/20',
            'thumb' => 'http://localhost/wp-content/uploads/2020/02/thumb_400_DSC_0102-scaled.jpg'
        )
);

Теперь из этого я должен сделать массив только категорий (ftag и tag), где ftag является отцом Категория и тег - это категория. Я подумал, что я мог бы заказать «уровни» с какими-то вложенными массивами, чтобы потом распечатать данные со структурой, такой как:

<ul>
    <li>Category</li>
    <li>Category
        <ul>
            <li>Subcategory</li>
            <li>Subcategory
                <ul>
                    <li>3rd Level</li>
                </ul>
            </li>
        </ul>
    </li>
    <li>Category</li>
</ul>

1 Ответ

0 голосов
/ 04 февраля 2020

Я изо всех сил пытаюсь понять ваш код, но допустим, у вас есть список категорий со списком продуктов внутри каждой категории. Хорошая структура для массива будет выглядеть примерно так:

$categories = array(
   array(
      'name' => 'Category 1',
      'products' => array(
         array('name' => 'Product 1'),
         array('name' => 'Product 2'),
      ),
   ),
   array(
      'name' => 'Category 2',
      'products' => array(
         array('name' => 'Product 3'),
         array('name' => 'Product 4'),
         array('name' => 'Product 5'),
      ),
   ),
);

Это создаст список из двух категорий: категория 1 и категория 2. В категории 1 есть 2 продукта, в категории 2 - 3 продукта.

Теперь мы можем l oop вокруг них и построить вложенный список HTML:

<ul>
   <?php foreach ($categories as $category) : ?>
      <li>
         <?php print $category['name']; ?>
         <ul>
            <?php foreach ($category['products'] as $product) : ?>
               <li><?php print $product['name']; ?></li>
            <?php endforeach; ?>
         </ul>
      </li>
   <?php endforeach; ?>
</ul>

Надеюсь, это поможет.

...