假设我有一个数组
[
{0:1, 1:5, 3:null},
{0:4, 1:null, 3:null},
{0:null, 1:5, 3:5}
]
我想算一下,所以我的预期输出是
[{0:2, 1:2, 3:1}]
我不知道如何存档,请帮忙。
答案 0 :(得分:0)
步骤:
1)循环遍历数组。您将获得子阵列。
2)循环子数组,我们将得到实际的数值。
3)准备一个数组,其中键作为子数组中的数值。
4)每次在内部循环中,如果值在结果数组中作为键存在。
5)如果存在,请增加计数。
这可能是您的解决方案:
<?php
$arr = [
[0 => 1, 1 => 5, 3 => null],
[0 => 4, 1 => null, 3 => 2],
[0 => null, 1 => 5, 3 => 5]
];
$out = array();
foreach ($arr as $key => $value){
foreach ($value as $key2 => $value2){
$index = $value2;
if (array_key_exists($index, $out)){
$out[$index]++;
} else {
$out[$index] = 1;
}
}
}
echo "Original array:<br/>";
echo '<pre>';print_r($arr);echo '</pre>';
echo "Counted values:<br/>";
echo '<pre>';print_r($out);echo '</pre>';
?>
输出:
原始阵列:
Array
(
[0] => Array
(
[0] => 1
[1] => 5
[3] =>
)
[1] => Array
(
[0] => 4
[1] =>
[3] => 2
)
[2] => Array
(
[0] =>
[1] => 5
[3] => 5
)
)
Counted values:
Array
(
[1] => 1
[5] => 3
[] => 3
[4] => 1
[2] => 1
)
答案 1 :(得分:0)
如果你想要值的总和,虽然这确实假设所有数组都与第一行具有相同的列...
$data = '[
{"0":1, "1":5, "3":null},
{"0":4, "1":null, "3":2},
{"0":null, "1":5, "3":5}
]';
$data = json_decode($data, true);
$out = array();
foreach ( array_keys($data[0]) as $key ) {
$out[$key] = array_sum(array_column($data, $key));
}
print_r(json_encode($out));
这会查看数据的第一行并获取列的列表(使用array_keys()
),然后从整个数组中提取此列的值(使用array_column()
)并添加这些值在一起(使用array_sum()
)。
输出是......
{"0":5,"1":10,"3":7}
<强>更新强> 问题编辑后......
$data = '[
{"0":1, "1":5, "3":null},
{"0":4, "1":null, "3":null},
{"0":null, "1":5, "3":5}
]';
$data = json_decode($data, true);
$out = array();
foreach ( array_keys($data[0]) as $key ) {
$out[$key] = 0;
foreach ( array_column($data, $key) as $value ) {
if ( $value ) {
$out[$key]++;
}
}
}
print_r(json_encode($out));
...输出
{"0":2,"1":2,"3":1}
使用类似的原则,但只是遍历每一列并保持包含值的那些列的计数。
或更短版本......
$data = json_decode($data, true);
$out = array();
foreach ( array_keys($data[0]) as $key ) {
$out[$key] = count(array_filter(array_column($data, $key)));
}
print_r(json_encode($out));