У меня есть 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
Captain 18 Фев 2018 в 14:19

1 ответ

Лучший ответ

Сложность решения с двумя вложенными foreach составляет O(n * k), где n = len(array1) и k = len(array2). Однако вы можете добиться меньшей сложности O(n + k), используя хэш-таблицы (ассоциированные массивы в мире PHP).

$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 также является хорошим решением.

0
Ivan Velichko 18 Фев 2018 в 14:48