#php #mysql #arrays
#php #mysql #массивы
Вопрос:
У меня есть результат из базы данных.
Array
(
[0] = stdClass Object
(
[name] = First
[sum] = 3,8,...
)
[1] = stdClass Object
(
[name] = Second
[sum] = -1,0,...
)
[2] = stdClass Object
(
[name] = Third
[sum] = 2,-1...
)
)
Итак, теперь мне нужно суммировать все в столбце «сумма».
Мне нужно получить результат, подобный
$final = (4, 7,...);
Я преобразовал sum в array throw explode(), а затем попробовал с foreach
например
foreach ($result as $k=>$subArray) {
$arrayNumbers = explode(",",$subArray->sum);
foreach ($arrayNumbers as $key => $value) {
$sumArray[] = $value];
$stepToSum2[] = array_sum($sumArray);
}
unset($arrayNumb);
}
Не уверен, что мой пример работает, потому что я уже застрял с прокомментированным кодом.
В любом случае, я с помощью некоторых манипуляций могу получить или суммировать правильные первые числа (5) или сумму моего массива (11).
Тот же результат с этим
$sum = array_sum(array_map(function($var) {
return $var['sum'];
}, $myResultArray));
Я искал ответ, но большинство ответов только для двух массивов, но в одних и тех же таблицах у меня более 5 массивов, поэтому я не могу понять, как это реализовать.
Комментарии:
1. У вас всегда одинаковая структура для атрибута sum в вашей базе данных?
2. номер 1, номер 2?
3. или может быть x чисел в строке
4. Существует более 100 чисел для каждого из них, разделенных запятой, но всегда с одним и тем же номером. Структура та же.
Ответ №1:
array_reduce
подходит для уменьшения массива до одного значения, как вы делаете здесь. Он принимает массив и функцию, которая обновляет значение «переноса» для каждого элемента в вашем массиве.
$result = array_reduce($your_array, function($carry, $item) {
foreach (explode(',', $item->sum) as $key => $value) {
$carry[$key] = $value (isset($carry[$key]) ? $carry[$key] : 0);
// (OR $carry[$key] = $value ($carry[$key] ?? 0); in PHP 7)
}
return $carry;
}, []);
Комментарии:
1. Это только для двух чисел в сумме?
2. Потому что моя сумма выглядит как [сумма] => 3.96,8.24,11.64,14.79,16.16,17.38,17.85,18.28,18.28
3. О, я понимаю. Да, это только для двоих. Я основал это на том, что было показано в вашем вопросе, но я могу обновить его, чтобы показать, как это может работать для большего.
4. Обновите, пожалуйста. Я уверен, что это будет полезно в будущем.
Ответ №2:
Поскольку вы уже создаете массив:
foreach ($result as $subArray) {
$arrayNumbers[] = explode(",", $subArray->sum);
}
$first = array_sum(array_column($arrayNumbers, 0));
$second = array_sum(array_column($arrayNumbers, 1));
Ответ №3:
Попробуйте это :
foreach ($result as $k => $subArray) {
$arrayNumbers = explode(",",$subArray->sum);
foreach ($arrayNumbers as $key => $value) {
$sumArray[$key] = isset($sumArray[$key]) ? $sumArray[$key] : 0;
$sumArray[$key] = $value;
}
}
print_r($sumArray);