Как распечатать базовый массив как дерево в php - PullRequest
0 голосов
/ 22 мая 2018

У меня есть базовый массив:

(
  [id] => 1
  [position_level] => 1
  [chief_id] => 9
  [full_name] => Verda Lubowitz
  [employment_start] => 1997-12-01
  [salary] => 1405
)

(
  [id] => 1
  [position_level] => 2
  [chief_id] => 9
  [full_name] => Verda Lubowitz
  [employment_start] => 1997-12-01
  [salary] => 1405
)

И я хочу распечатать этот массив в структуре следующим образом:

<ul>
    <li>Position level 1</li>
    <ul>
        <li>Position level 2</li>
        <li>Position level 2</li>
        <li>Position level 2</li>
        <ul>
            <li>Position level 3</li>
            <li>Position level 3</li>
            <li>Position level 3</li>
            <ul>
                <li>Position level 4</li>
                <li>Position level 4</li>
                <li>Position level 4</li>
            </ul>
        </ul>
    </ul>
</ul>

Как вы можете видеть, структура похожа на деревои это связано с уровнем должности работника.Я потратил три дня и не смог придумать элегантное решение, просто решение с безобразным выражением if и elseif, которое будет очень трудно поддерживать.Я использую движок шаблонов и клинка.

Ответы [ 4 ]

0 голосов
/ 22 мая 2018

Чтобы предложить то, чего, как мне кажется, не хватает другим, воспользуйтесь упаковщиком коллекций Laravel.Есть отличные методы, которые могут помочь вам не делать вещи с нуля.

$values = collect($data);

// find highest iteration
$highestLevel = $values->pluck('position_level')->max();

// bunch into groups
$groups = $values->groupBy('position_level');

Затем выполните итерацию по лезвию:

@foreach($groups as $group)

    // start your group position level up tag

    @foreach($group as $value)

        // do stuff here with $value being your individual sub array 
        // that you can access via object syntax ($value->position_level)

    @endforeach

    // end your group ul tag

@endforeach

Наконец, я хотел бы отметить, что HTML на самом деле не имеет визуальной древовидной структуры.Именно так мы его кодируем, чтобы его было легче понять, и это также показывают нам инструменты разработки для браузера.

Так что, если вы хотите получить версию с соответствующим отступом, вы можете скопировать код блейда в вашем контроллере и создать строку.Для каждой «группы» или уровня вы должны добавить строку с номером уровня, умноженным на длину табуляции (возможно, 4 пробела).

0 голосов
/ 22 мая 2018

вы можете использовать foreach loop:

<ul>
   @foreach($array_1 as $data)
 <li>{{$data->title_1}}</li>
   @endforeach
<ul>
  @foreach($array_2 as $data)
    <li>{{$data->title_2}}</li>
  @endforeach
    <ul>
      @foreach($array_3 as $data)
        <li>{{$data->title_3}}</li>
      @endforeach
        <ul>
         @foreach($array_4 as $data)
            <li>{{$data->title_4}}</li>
         @endforeach
        </ul>
    </ul>
</ul>

0 голосов
/ 22 мая 2018

Сначала вам нужно изменить порядок массива на основе position_level.Вы можете сделать это, просто просматривая массив и создавая новый, в котором индекс равен position_level, а содержимое - это все строки в этой позиции.Затем вы можете использовать рекурсивную функцию для достижения того, что вы хотите.

Код (с образцами данных):

<?php

$testarray = [
    [
        'id' => 1,
        'position_level' => 1,
        'chief_id' => 9,
        'full_name' => 'Verda Lubowitz 1',
        'employment_start' => '1997-12-01',
        'salary' => 1405,
    ],
    [
        'id' => 2,
        'position_level' => 3,
        'chief_id' => 9,
        'full_name' => 'Verda Lubowitz 3',
        'employment_start' => '1997-12-01',
        'salary' => 1405,
    ],
    [
        'id' => 3,
        'position_level' => 2,
        'chief_id' => 9,
        'full_name' => 'Verda Lubowitz 2',
        'employment_start' => '1997-12-01',
        'salary' => 1405,
    ],
    [
        'id' => 4,
        'position_level' => 2,
        'chief_id' => 9,
        'full_name' => 'Verda Lubowitz 2',
        'employment_start' => '1997-12-01',
        'salary' => 1405,
    ],
];

// Initialize an empty array
$newarray = [];
// Loop through original array
foreach($testarray as $entry) {
    // Append entry to $newarray[position_level]
    $newarray[$entry['position_level']][] = $entry;
}

// Call the recursive function starting from level 1
draw_tree($newarray, 1);

function draw_tree($array, $startlevel) {
    // No more levels, return
    if(!isset($array[$startlevel])) {
        return;
    }
    // Draw the current level
    echo '<ul>';
    // And its contents
    foreach($array[$startlevel] as $entry) {
        echo '<li>' . $entry['full_name'] . '</li>';
    }
    // Call the next level before closing the ul tag
    draw_tree($array, $startlevel + 1);
    // Close the ul tag
    echo '</ul>';
}

Выход:

<ul>
    <li>Verda Lubowitz 1</li>
    <ul>
        <li>Verda Lubowitz 2</li>
        <li>Verda Lubowitz 2</li>
        <ul>
            <li>Verda Lubowitz 3</li>
        </ul>
    </ul>
</ul>

Я установилрабочий пример здесь: http://sandbox.onlinephpfunctions.com/code/da9784e8526de18f9fe34dcf859ac3feee44ad63

Обратите внимание, что эта функция не может «пропускать» уровни, поэтому, если у вас есть запись уровня 1 и уровня 3, функция будет рисовать только уровень 1, а затем возвращает,Если это так, вам нужно немного более сложное решение, но я предполагаю, что у вас нет пропущенных (пустых) уровней.

0 голосов
/ 22 мая 2018

Цикл по массиву данных.Сгруппируйте массив данных по уровню позиции, как показано ниже:

[
 "position_level_1" => [
    (
     [id] => 1
     [position_level] => 1
     [chief_id] => 9
     [full_name] => Verda Lubowitz
     [employment_start] => 1997-12-01
     [salary] => 1405
    ),
    ...
    ...
  ],
  "position_level_2" => [
(
  [id] => 1
  [position_level] => 2
  [chief_id] => 9
  [full_name] => Verda Lubowitz
  [employment_start] => 1997-12-01
  [salary] => 1405
)
  ]
]

После форматирования всех этих циклов данных через него.используйте неупорядоченный список для вывода этих данных в html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...