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

У меня есть данные в 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 Ответ

0 голосов
/ 04 ноября 2018

Расшифруйте, затем итерируйте массив. Если первое вхождение 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 или falsefalse может произойти только в случае сбоя). http://php.net/manual/en/function.ksort.php Как только вы напишите ksort($arrsi);, а затем return $arrsi;, ваша функция вернет желаемый результат.
  • Вы заявляете, но не используете $i, чтобы можно было безопасно удалить строку.
  • Первое объявление $sum = 0; необязательно, потому что вы повторно объявите переменную позже во втором цикле.
  • Ваш первый цикл создает ненужную раздутую структуру данных. Назначение значений size в качестве ключей, безусловно, является правильным шагом. Хранение каждого набора дат в качестве подмассива нового ключа - это больше, чем нужно. Это заставляет вас следовать за вложенным циклом.
...