Вы могли бы избежать использования foreach, используя функции массива, если бы вы были склонны к этому.
Закрытие, предоставленное для array_map
документов нижевычтет каждое значение $arr1
из каждого соответствующего $arr2
.К сожалению, array_map
не сохранит ваши ключи при использовании более одного входного массива, поэтому мы используем array_combine
документы , чтобы объединить вычтенные результаты обратно вмассив с оригинальными ключами:
$arr1 = array('a' => 1, 'b' => 3, 'c' => 10);
$arr2 = array('a' => 2, 'b' => 1, 'c' => 5);
$subtracted = array_map(function ($x, $y) { return $y-$x; } , $arr1, $arr2);
$result = array_combine(array_keys($arr1), $subtracted);
var_dump($result);
UPDATE
Мне было интересно, как функции массива подходят по сравнению с простым foreach, поэтому я сравнил оба с помощью Xdebug,Вот тестовый код:
$arr1 = array('a' => 1, 'b' => 3, 'c' => 10);
$arr2 = array('a' => 2, 'b' => 1, 'c' => 5);
function arrayFunc($arr1, $arr2) {
$subtracted = array_map(function ($x, $y) { return $y-$x; } , $arr1, $arr2);
$result = array_combine(array_keys($arr1), $subtracted);
}
function foreachFunc($arr1, $arr2) {
$ret = array();
foreach ($arr1 as $key => $value) {
$ret[$key] = $arr2[$key] - $arr1[$key];
}
}
for ($i=0;$i<10000;$i++) { arrayFunc($arr1, $arr2); }
for ($i=0;$i<10000;$i++) { foreachFunc($arr1, $arr2); }
Как выясняется, использование цикла foreach
на порядок быстрее, чем выполнение той же задачи с использованием функций массива.Как видно из приведенного ниже изображения вызываемого KCachegrind, метод функции массива потребовал почти 80% времени обработки в приведенном выше коде, а функция foreach - менее 5%.
Урок здесь: иногда более семантические функции массива (удивительно?) Могут уступать в производительности старому доброму циклу в PHP.Конечно, вы всегда должны выбирать вариант, который является более читабельным / семантическим;Подобные микрооптимизации не оправданы, если они затрудняют понимание кода через шесть месяцев.