PHP - 计算数组中的匹配数组

时间:2010-04-18 16:33:44

标签: php arrays

我有一个如下所示的数组结构:

    Array
(
    [0] => Array
        (
            [type] => image
            [data] => Array
                (
                    [id] => 1
                    [alias] => test
                    [caption] => no caption
                    [width] => 200
                    [height] => 200
                )

        )

    [1] => Array
        (
            [type] => image
            [data] => Array
                (
                    [id] => 2
                    [alias] => test2
                    [caption] => hello there
                    [width] => 150
                    [height] => 150
                )

        )

)

我的问题是,如何计算其类型设置为图像的嵌入式阵列的数量(或其他任何事情)?在实践中,这个值可能会有所不同。

所以,上面的数组会给我一个2的答案。

由于

5 个答案:

答案 0 :(得分:2)

最简单的方法就是遍历所有子数组并检查它们的类型,如果匹配所需类型,则递增计数器。

$count = 0;
foreach ( $myarray as $child ){
    if ( $child['type'] == 'image' ){
        $count++;
    }
}

如果你有PHP 5.3.0或更高版本,你可以使用array_reduce(未经测试):

$count = array_reduce($myarray, 
                      function($c, $a){ return $c + (int)($a['type'] == 'image'); },
                      0
         );

这两个都可以移动到返回$count的函数中,这将允许您指定要计数的类型。例如:

function countTypes(array $haystack, $type){
    $count = 0;
    foreach ( $haystack as $child ){
        if ( $child['type'] == $type ){
            $count++;
        }
    }
    return $count;
}

正如你从其他答案中可以看到的那样,你可以做更多的错误检查,但是你没有说过什么是不可能的(你想要使用assert)。

可能的错误是:

  • 孩子不是阵列
  • 孩子确实拥有type密钥集

如果你的数组应该像你的例子一样被设置,那么默默地失败(通过检查if语句)会是一个坏主意,因为它会掩盖程序中其他地方的错误。

答案 1 :(得分:1)

您必须遍历数组的每个元素并检查元素是否符合您的条件:

$data = array(...);

$count = 0;
foreach ($data as $item) {
    if ('image' === $item['type']) {
        $count++;
    }
}

var_dump($count);

答案 2 :(得分:1)

试试这个:

function countArray(array $arr, $arg, $filterValue)
{
    $count = 0;
    foreach ($arr as $elem)
    {
        if (is_array($elem) &&
                isset($elem[$arg]) &&
                $elem[$arg] == $filterValue)
            $count++;
    }
    return $count;
}

对于您的示例,您可以这样称呼它:

$result = countArray($array, 'type', 'image');

答案 3 :(得分:1)

<?php
$arr    = // as above
$result = array();

for ( $i = 0; $i < count( $arr ); $i++ )
{
    if ( !isset( $result[ $arr[$i]['type'] ] ) )
        $result[ $arr[$i]['type'] ] = 0;
    $result[ $arr[$i]['type'] ]++;
}

echo $result['image']; // 2
?>

答案 4 :(得分:1)

除了Yacoby的答案之外,如果你使用PHP 5.3,你可以使用闭包来实现功能风格:

$count = 0;
array_walk($array, function($item)
{
    if ($item['type'] == 'image')
    {
        $count++;
    }
});