我有基本数组:
(
[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和刀片模板引擎。
答案 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个空格)前缀。