php - 将一个数组缩减为另一个数组
问题描述
在 laravel 刀片模板中,我试图减少这样的数组:
$longList = [['box' => 1, 'kg' => 2], ['box' => 2, 'kg' => 2], ['box' => 3, 'kg' => 3]];
变成这样的东西:
$reducedList = [['count' => 2, 'kg' => 2], ['count' => 1, 'kg' => 3]];
这是我到目前为止所拥有的:
@php
$variableWeights = isset($sale->variable_weight_json) ? collect(json_decode($sale->variable_weight_json, true)) : null;
$groups = array();
if (isset($variableWeights)) {
$groups = $variableWeights->reduce(function($carry, $item) {
$index = array_search($item['kg'], array_column($carry, 'weight'));
if (isset($index)) {
$existing = $carry[$index];
array_splice($carry, $index, 1, [
'count' => $existing['count'] + 1,
'weight' => $item['kg']
]);
} else {
array_push($carry, [
'count' => 1,
'weight' => $item['kg'],
]);
}
return $carry;
}, array());
}
@endphp
但它给了我错误 Undefined offset: 0
我是 php 新手。应该如何更正代码或者是否有更好的方法来达到预期的结果?
解决方案
你为什么不把它简化为像这样更简单的东西
$reducedList = [2 => 2, 3 => 1]
其中权重是索引,值是计数。
$reducedList = [];
foreach ($longList as $box) {
if (isset($reducedList[$box['kg']]) {
$reducedList[$box['kg']]++;
} else {
$reducedList[$box['kg']] = 1;
}
}
这样可以避免复杂性,但您仍然可以获得相同数量的信息。
推荐阅读
- node.js - yarn run [dev] 执行的命令和它的 vanilla 节点实现有什么区别?
- html - 使用 jQuery 搜索表格时隐藏
- c++ - 在 C++ Dev-Cpp 中安装外部库
- javascript - 编写一个接受字符串并返回仅包含元音的新字符串的函数
- python - Scrapy:如何解析多个页面?
- python - 将 Textblob 翻译问题转换为 pandas 数据框
- r - 根据用户输入更新 x / y 图(闪亮)
- python - Python:如何使用日期作为参数从第三个 python 脚本自动化两个 python 脚本?
- node.js - 如何从 Docker 中运行的 rabbitMq 容器向 Localhost 发送请求
- google-sheets - 谷歌表格条件格式问题