提问人:DanielAttard 提问时间:11/27/2011 最后编辑:mickmackusaDanielAttard 更新时间:9/13/2023 访问量:55051
对每个子数组中的项目进行计数,以生成唯一键和计数的关联数组
Count items in each subarray to produce an associative array of unique keys and counts
问:
从下面的数组中可以看出,有三个元素出现在 11 月 18 日,另外两个元素出现在 11 月 22 日。有人可以告诉我如何从这个数组中分别检索 3 和 2 的计数吗?基本上,我想最终得到这样的结果:
2011年11月18日 = 3项
2011年11月22日 = 2项
当然,日期和不同日期的数量每次都会有所不同。下面是数组:
[
[
['2011-11-18 00:00:00' => 'C'],
['2011-11-18 00:00:00' => 'I'],
['2011-11-18 00:00:00' => 'S']
],
[
['2011-11-22 00:00:00' => 'C'],
['2011-11-22 00:00:00' => 'S']
]
]
答:
这适用于您的需求吗?
$dates = array(array(array("2011-11-18 00:00:00" => C), array("2011-11-18 00:00:00" => I),array
("2011-11-18 00:00:00" => S)),
array(array("2011-11-22 00:00:00" => C), array("2011-11-22 00:00:00" => S)));
$date_count = array(); // create an empty array
foreach($dates as $date) { // go thought the first level
foreach($date as $d) { // go through the second level
$key = array_keys($d); // get our date
// here we increment the value at this date
// php will see it as 0 if it has not yet been initialized
$date_count[$key[0]]++;
}
}
// show what we have
print_r($date_count);
指纹:
Array ( [2011-11-18 00:00:00] => 3 [2011-11-22 00:00:00] => 2 )
注意:这假设您在构建数组时将始终获取数据,并且每个日期的格式相同。如果您不能假设每个日期都将被格式化,这将是使用 date() 函数的简单转换。如果你不能假设你会得到完全这样的结构数据,那么解决这个问题的最好方法可能是通过递归函数。
评论
假设您的数组示例具有代表性:
foreach ($array as $key => $value)
{
echo count($value) . "<br />";
}
将回显每个主数组项中的数组数。在您的示例中,这也是每个日期的条目数。
这当然不会检查日期本身
您可以使用 array_walk_recursive()
访问数组结构中的所有叶节点。
与此类似的东西应该对你有用:
<?php
$data = array(
array(
array('2011-11-18 00:00:00' => 'C'),
array('2011-11-18 00:00:00' => 'I'),
array('2011-11-18 00:00:00' => 'S')),
array(
array('2011-11-22 00:00:00' => 'C'),
array('2011-11-22 00:00:00' => 'S')));
function countleafkeys($value, $key, $userData)
{
echo "$key\n";
if(!isset($userData[$key])) {
$userData[$key] = 1;
} else {
$userData[$key]++;
}
}
$result = array();
array_walk_recursive($data, 'countleafkeys', &$result);
print_r($result);
输出:
2011-11-18 00:00:00
2011-11-18 00:00:00
2011-11-18 00:00:00
2011-11-22 00:00:00
2011-11-22 00:00:00
Array
(
[2011-11-18 00:00:00] => 3
[2011-11-22 00:00:00] => 2
)
评论
array_walk_recursive()
发布的答案对于您的代表性示例是正确的,但我想添加另一个解决方案,无论您创建多少个嵌套数组,它都可以工作。它以递归方式迭代数组,并计算所有子数组中的所有项目。
它返回数组中项的总数。在第二个参数中,您可以指定一个数组 引用,它将包含(嵌套)数组中每个唯一键的计数。
例:
<?php
$deeply_nested = array(
'a' => 'x',
'b' => 'x',
'c' => 'x',
'd' => array(
'a' => 'x',
'b' => 'x',
'c' => array(
'a' => 'x',
'b' => 'x'
),
'e' => 'x'
)
);
function count_nested_array_keys(array &$a, array &$res=array()) {
$i = 0;
foreach ($a as $key=>$value) {
if (is_array($value)) {
$i += count_nested_array_keys($value, &$res);
}
else {
if (!isset($res[$key]) $res[$key] = 0;
$res[$key]++;
$i++;
}
}
return $i;
}
$total_item_count = count_nested_array_keys($deeply_nested, $count_per_key);
echo "total count of items: ", $total_item_count, "\n";
echo "count per key: ", print_r($count_per_key, 1), "\n";
结果是:
total count of items: 8
count per key: Array
(
[a] => 3
[b] => 3
[c] => 1
[e] => 1
)
评论
这是我的递归变体:
$arr = array(
'0' => array(
'0' => array('2011-11-18 00:00:00' => 'C'),
'1' => array('2011-11-18 00:00:00' => 'I'),
'2' => array('2011-11-18 00:00:00' => 'S')
),
'1' => array(
'0' => array('2011-11-22 00:00:00' => 'C'),
'1' => array('2011-11-22 00:00:00' => 'S')
),
'2' => array(
'0' => array(
'0' => array('2011-11-22 00:00:00' => 'D')
)
)
);
function count_values($array, &$result = array(), $counter = 0)
{
foreach ($array as $key => $data)
{
if (is_array($data))
{
count_values($data, $result, $counter);
}
else
{
array_key_exists($key, $result) ? $result[$key]++ : $result[$key] = 1;
}
}
return $result;
}
print_r(count_values($arr));
这将返回:
Array ( [2011-11-18 00:00:00] => 3 [2011-11-22 00:00:00] => 3 )
对于您的特定结构,我认为最精简的方法是使用然后获取日期值和每个值:$array
foreach
count()
$dateCounts = array();
foreach($array as $date)
{
$dateCounts[key($date[0])] = count($date);
}
var_dump($dateCounts);
有了你,这给了:$array
array(2) {
["2011-11-18 00:00:00"]=> int(3)
["2011-11-22 00:00:00"]=> int(2)
}
如果你正在寻找一种更通用的方法,你可以利用并遍历所有叶键/值元素,然后只计算键:RecursiveArrayIterator
RecursiveIteratorIterator
$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
$keyCounts = array();
foreach ($it as $key => $value)
{
isset($keyCounts[$key]) ? $keyCounts[$key]++ : $keyCounts[$key] = 1;
}
var_dump($keyCounts);
希望这会有所帮助。
评论
您可以使用:
count($array, COUNT_RECURSIVE);
评论
count
<?php
$count0=count($array[0], COUNT_RECURSIVE)-count($array[0]);
$count1=count($array[1], COUNT_RECURSIVE)-count($array[1]);
评论
max( 0, count($array, COUNT_RECURSIVE) - count($array) )
max(0, ...)
如果您想计算一维和二维的项目,您可以尝试:
echo 'Size of unidimensional is: '.count($celda).'<br/>';
echo 'Size of bidimensional is: '.count($celda[0]).'<br/>';
评论