Сравнение массивов на идентичность

214
30 марта 2017, 22:44

Здравствуйте, есть такой дырявый код (цикл в цикле)..

    foreach($result as $r){
        foreach($ids_time as $time){
            if($r['id_time'] == $time['id']){
                $row[] = $r;
            }
        }           
    }

Нужно более по простому сделать сравнение и вывести значения массива $result у которых идентичны значения с массивом $ids_time как это делает подобный код.

Массив $ids_time такого вида

[0] => Array
    (
        [id] => 93
        [date] => 2017-03-31
    )

А массив $result такого вида

[0] => Array
    (
        [id] => 22
        [id_time] => 93
        [id_client] => 69
    )
Answer 1

Если идентификаторы id уникальны, то вернее будет обойти оба массива по одному разу. Например, проиндексируйте массив $ids_time, а затем смапте id_time из $result в соответствующие значения:

function arr_index($arr, $key) {
    $result = [];
    foreach ($arr as $item) {
        if (isset($item[$key])) {
            $result[$item[$key]] = $item;
        }
    }
    return $result;
}
$indexed_time = arr_index($ids_time, 'id');
$row = array_map(function($item) use($indexed_time) {
    return $indexed_time[$item['time_id']] ?? null;
}, $result);
Answer 2

Можно написать callback-функцию в array_uintersect. Но зачем? Есть вещи, которые не стоит усложнять. К сожалению, в данном примере массив многомерный, и красивого способа сравнения нет, поэтому лучше оставить как есть.

Answer 3

Можно избавиться от вложенных циклов, если переписать код так:

$timesId = [];
foreach ($ids_time as $time) {
    $timesId[$time['id']] = $time['id'];
}
foreach ($result as $r) {
    if (!empty($timesId[$r['id_time']])) {
        $row[] = $r;
    }
}

Это немного упростит восприятие и сопровождение кода, но отъест памяти на временную переменную.

Если id у времени - уникальное поле, то можно использовать его в качестве ключа в массиве и тогда останется только проверять наличие таких ключей - без временного массива и без вложенного цикла. Но для этого надо больше деталей о ваших данных, которыми вы оперируете. Так с ходу не сказать. Например, если они (данные) изначально лежали в базе, то может решить проблему можно ещё на этапе выборки, переписав запрос, и не мучиться потом с массивами в коде.

READ ALSO
Загрузка изображений для vk.com через api

Загрузка изображений для vk.com через api

Необходимо загрузить изображение для Товаров в ВконтактеПолучаю адрес для загрузки методом https://vk

576
Массив данных из фигурных скобок в строке

Массив данных из фигурных скобок в строке

Не могу получить массив из строки, если перед скобками есть символы

260
Как узнать размер изображения

Как узнать размер изображения

Подскажите, как сделать так чтобы при загрузке аватарки (изображения) меньше 200x200 выбивало ошибку?

161
Отображение подзаголовков в категории. PHP и MySQL

Отображение подзаголовков в категории. PHP и MySQL

У меня появился вопрос, как сделать так, чтобы на странице категории подгружались подзаголовки, под которыми уже отображались конечные статьи?

191