Array_diff_assoc () или foreach ()? Что быстрее?

У меня есть два массива, например $session и $post со 100+ значениями. Я сравню значения массива $post с массивом $session. Если сообщение отличается, оно будет перенесено в массив результатов, иначе нет.

Мы можем попробовать это с помощью array_diff_assoc($post, $session) and foreach(). Какой из них быстрее?

Что за вопрос здесь?

hungrykoala 22.05.2018 08:03

Почему бы вам не попробовать и не посмотреть, что быстрее ~ Самый простой способ профилировать PHP-скрипт

Phil 22.05.2018 08:04

@Phil Я пробовал. PHP_functions выглядит медленнее, чем foreach ()

Octopus 22.05.2018 08:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
3
197
2

Ответы 2

Для профилирования Фил в своем ответе предложил отличный способ, но на всякий случай я также свяжу его здесь: Самый простой способ профилировать PHP-скрипт

На практике вам нужно знать, что делает каждый подход. в array_diff_assoc вы возвращаете разницу между двумя коллекциями после сравнения пар ключ / значение для каждого элемента. Затем он вернет массив, содержащий записи из array1, которых нет в array2 или array3, и т. д.

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

Применяются те же принципы, но, опять же, определение более быстрого подхода зависит от профилирования. Попробуйте сделать это на большом количестве больших массивов, так как в меньших масштабах разница не заметна.

Я оставлю это как заглушку / пример, пожалуйста, отредактируйте или используйте для профилирования.

<?php

$before = [
    'name' => 'Bertie',
    'age' => '23'
];
$after  = [
    'name' => 'Harold',
    'age' => '23',
    'occupation' => 'Bus driver' 
];

function changed_1($after, $before) {
    return array_diff_assoc($after, $before);
}

function changed_2($after, $before) {
    $changed = [];
    foreach($after as $k => $v) {
        if (isset($before[$k]) && $before[$k] !== $v)
            $changed[$k] = $v;
        if (!isset($before[$k]))
            $changed[$k] = $v;
    }

    return $changed;
}

var_export(changed_1($after, $before));
var_export(changed_2($after, $before));

Выход:

array (
  'name' => 'Harold',
  'occupation' => 'Bus driver',
)array (
  'name' => 'Harold',
  'occupation' => 'Bus driver',
)

Я поместил здесь код 3v4l.org/pS8uc с более чем 4000 записями с разными значениями (худший случай). Игнорируйте результаты их оценщика и исследуйте себя или профилируйте по-другому. Для меня array_diff_assoc быстрее.

Progrock 22.05.2018 09:49

Другие вопросы по теме