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

У меня есть данные в MySQL. Данные созданы с помощью данных JSON. Но я не могу перейти в массив из ключей данных. Я хочу установить эти данные в порядке и в зависимости от количества акций.

[
{"size":"36","stock":"1"},
{"size":"37","stock":"2"},
{"size":"38","stock":"1"},
{"size":"40","stock":"1"},
{"size":"36","stock":"1"},
{"size":"37","stock":"3"},
{"size":"38","stock":"2"},
{"size":"39","stock":"3"},
{"size":"40","stock":"2"}
]

Я хочу изменить на:

array(
'36' => '2',
'37' => '5',
'38' => '3',
'39' => '3',
'40' => '3',
)

Я написал эту функцию, но она только возвращает true и я чувствую, что это может быть более изысканным:

function shoesizes($json,$key='size')
{
$array =  json_decode($json);
$result = array();
$sum = 0;
$i=0;
foreach((array) $array as $val) {
if(array_key_exists($key, $val)){
$result[$val->$key][] = (array)$val;
}else{
$result[""][] = $val;
}
}
$arrsi = array();
foreach ($result as $k => $v) {
$sum = 0;
foreach ($v as $c => $d) {
$sum +=     $d['stock'];
}
$arrsi[$k]= $sum;
}
return ksort($arrsi);

}

-1

Решение

Затем расшифруйте массив. Если первое появление size сохранить целочисленное значение, если не добавить новое значение к сохраненному значению. Когда закончите, сортируйте по ключам массива результата.

Код: (демонстрация)

$json = '[
{"size":"36","stock":"1"},
{"size":"37","stock":"2"},
{"size":"38","stock":"1"},
{"size":"40","stock":"1"},
{"size":"36","stock":"1"},
{"size":"37","stock":"3"},
{"size":"38","stock":"2"},
{"size":"39","stock":"3"},
{"size":"40","stock":"2"}
]';

$array = json_decode($json, true);
foreach ($array as $row) {
if (isset($result[$row['size']])) {
$result[$row['size']] += $row['stock'];
} else {
$result[$row['size']] = (int)$row['stock'];
}
}
ksort($result);
var_export($result);

Выход:

array (
36 => 2,
37 => 5,
38 => 3,
39 => 3,
40 => 3,
)

Обзор кода:

  • ksort() возвращает логический результат. Письменно return ksort($arrsi);, вы можете только получить true или же false (а также false может случиться только при сбое). http://php.net/manual/en/function.ksort.php Как только ты пишешь ksort($arrsi); затем return $arrsi; тогда ваша функция возвращает желаемый результат.
  • Вы заявляете, но не используете $i так что эту линию можно безопасно удалить.
  • Первая декларация $sum = 0; не обязательно, потому что вы переопределите переменную позже во втором цикле.
  • Ваш первый цикл создает ненужную раздутую структуру данных. Назначение size значения в качестве ключей, безусловно, правильный шаг. Хранение каждого набора дат в качестве подмассива нового ключа — это больше, чем нужно. Это заставляет вас следовать за вложенным циклом.
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector