如何在php

时间:2018-05-22 09:01:15

标签: php laravel laravel-blade

我有基本数组:

(
  [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 ifs和ifif声明,女巫将很难维持。 我正在使用laravel和刀片模板引擎。

4 个答案:

答案 0 :(得分:1)

首先,您需要根据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

请注意,此功能无法跳过&#34;跳过&#34;等级,因此如果您有1级和3级条目,该函数将仅绘制级别1然后返回。如果是这种情况,您需要更复杂的解决方案,但我认为您没有丢失(空)级别。

答案 1 :(得分:0)

循环遍历数据数组。 按位置级别对数据数组进行分组,如下所示

{{1}}

格式化所有这些数据循环后。使用unorder list在html中绘制这些数据。

答案 2 :(得分:0)

您可以使用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>

答案 3 :(得分:0)

为了提供我觉得缺少其他东西的东西,请利用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个空格)前缀。