一般用于设定列数的子数据和foreach的方法

时间:2015-09-17 04:47:54

标签: php loops laravel for-loop foreach

我有一个通用的方法问题,虽然我的代码在Laravel Blade中。 我有子数据的数据。每个父记录由行表示,但每个子数据将显示在同一行中,仅显示在相邻列中。有一定数量的列。每个家长都会有不同的子记录。但是子数据需要显示在特定列中。

我不能这样做:

foreach($children as $data)
    if(data belongs)
        show content
    else
        show blank form
    endif
endforeach

否则我的td比所需的少。

我想出的最好的是:

<tr>
    <td> Location </td>
    <td>
        $colA = false

        @foreach($children as $data)
            @if(child belongs in column A)
                {{$child->content}}

                @colA = true
            @endif()
        @end foreach

        @if($colA == false)
            display blank form input
        @endif()

    </td>
    <td>
        $colB = false

        @foreach($children as $data)
            @if(child belongs in column B)
                {{$child->content}}

                @colB = true
            @endif()
        @end foreach

        @if($colB == false)
            display blank form input
        @endif()

    </td>


//-------repeat for 6 more times


</tr>

但这似乎效率低下。特别是因为我将同时显示多达一百个父记录,每个记录都有8个&#34; children-columns&#34;。因此,foreach循环将运行800次....

任何有助于提高效率的帮助都将非常感激。

谢谢

1 个答案:

答案 0 :(得分:0)

您可以一次性预处理数据,以便您的模板更容易使用。

所以在你的路线/控制器/模板之前的任何东西(或者在模板内):

$preProcessed = [];
for ($parents as $parent) {
    $orderedChildren = [];
    for ($parent->children as $child) {
        $childColumnIndex = ... <-- determine which column this child should be in
        $orderedChildren[$childColumnIndex] = $child;
    }
    $preProcessed[] = [$parent, $orderedChildren];
}

然后在你的模板中,循环遍历[parent,orderedChildren]对:

<tr>
    <td> Location </td>
    <td>
        @if(isset($orderedChildren[0]))
            $orderedChildren[0]->content();
        @else
            display blank form input
        @endif
    </td>
    [other columns]
</tr>

实际上,此时,您还可以循环列索引,而不是为每个索引复制html。

如果您可以在执行数据库查询时订购子数组,那么实际上有更好的方法可用。如果可以执行此操作,则可以删除预订步骤,但模板呈现代码会更复杂。在伪代码中:

for each parent:
    $nextChildIndex = 0
    for each column:
        if ($nextChildIndex < length($parent->children) &&
            $parent->children[$nextChildIndex] belongs to this column)

            $parent->children[$nextChildIndex]->content();
            $nextChildIndex++;
        else
            display blank form input