Задать вопрос
@snake2
Сразу пишу legacy код

Как обойти несколько массивов с одинаковыми значениями?

Есть 3 массива
$arr = [
    [1, 2, 3, 4],
    [1, 2, 3, 4],
    [1, 2, 3, 4],
];
$arr2 = [
    [1, 2, 3, 4],
    [1, 2, 3, 4],
];

$arr3 = [
    [1, 2, 3, 4]
];

$result = [
    [3, 6, 9, 12],
    [2, 4, 6, 8],
    [1, 2 ,3 , 4]
];


Можно ли их сложить не использую для каждого массива цикл, т.к массивов может быть и 4 и 5 и для каждого писать цикл такое себе занятие?
Может как-то поменять структуру отдаваемых данных?
  • Вопрос задан
  • 139 просмотров
Подписаться 1 Простой 6 комментариев
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Варианта два.
1. узнать про такую штуку, как пользовательская функция. И поместить код суммирования одного массива в неё. Тогда цикл будет внутри функции, и писать его три раза будет не нужно. Только три раза вызвать функцию
2. поместить эти три массива в другой, то есть у нас будет один главный массив, элементами которого будет три (или 5) массивов с цифрами. тогда можно будет перебрать этот внешний массив 1 раз у цикле, и внутри него написать цикл для суммирования. один раз
Ответ написан
Комментировать
Immortal_pony
@Immortal_pony Куратор тега PHP
Создай функцию, где твоя логика явно прописана:
function sumArrays(...$arrays) {
    usort($arrays, fn($a, $b) => count($b) - count($a));
    $biggest = $arrays[0];
    $other = array_slice($arrays, 1);
    $result = [];
    
    foreach ($biggest as $rowIndex=>$row) {
        $resultRow = [];
        
        foreach ($row as $fieldIndex => $field) {
            foreach ($other as $otherArray) {
                if (array_key_exists($rowIndex, $otherArray)) {
                    $field += $otherArray[$rowIndex][$fieldIndex];
                }
            }
            
            $resultRow[] = $field;
        }
                    
        $result[] = $resultRow;
    }
    
    return $result;
}


... Дальше используй её на любом количестве массивов
var_dump(sumArrays($arr2, $arr3, $arr));
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы