更好的方法来编写嵌套的foreach循环,多个数组比较php

时间:2018-02-18 11:19:56

标签: php arrays

我有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

1 个答案:

答案 0 :(得分:0)

两个嵌套的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也是一个很好的解决方案。