更好地编写嵌套foreach循环的方法,多个阵列比较php



我有2个多维数组。我通过foreach循环运行第一个,从中获取数据。然后在第一个创建嵌套的foreach环内运行第二个foreach循环。然后在第二个 foreach循环中我运行一个if语句以比较从第一个数组到第二个数组的值并显示一些有效的输出,但是我有点一点担心长时间的时间。所以我的问题是,是否有一种更清洁,更整洁的方法可以用较短的运行类型编写:

@foreach($arrayOne as $firstArray)
    @foreach($arrayTwo as $secondArray)
        @if($firstArray['id'] == $secondArray['linkedId'])
            /*output some data*/
        @endif
    @endforeach      
@endforeach

两个nest-foreach解决方案的复杂性是 O(n * k),其中 n = len(array1)k = len(array2)。但是,您可以通过使用哈希表(PHP世界中的关联阵列(实现较小的复杂性O(n + k)

$twoByLinkedId = [];
foreach ($arrayTwo as $x) {  // K iterations
    if (empty($twoByLinkedId[$x['linkedId']])) {
        $twoByLinkedId[$x['linkedId']] = [];
    }
    array_push($twoByLinkedId[$x['linkedId']], $x);
}
foreach ($arrayOne as $el) {  // N iterations
    $entries = empty($twoByLinkedId[$el['id']]) 
        ? [] 
        : $twoByLinkedId[$el['id']];
    foreach ($entries as $entry) {  // only few iterations
        /* output $entry */
    }
}

因此,您可以看到解决方案的复杂性是O(k + n*t),其中t是一个很小的数字。

当然,只有当两个阵列的长度真的很大,否则简单嵌套的foreach也是一个很好的解决方案时,技巧才有意义。

最新更新