计算多维关联数组内的项

时间:2016-05-05 16:32:07

标签: php multidimensional-array associative-array

所以我在PHP中有以下数据数组

$array = array(
           "animal" => "panda",
           "location" => "San Diego",
           "age" => "2",            
         ),
         array(
           "animal" => "tiger",
           "location" => "Bronx",
           "age" => "5",            
         ),
         array(
           "animal" => "panda",
           "location" => "Bronx",
           "age" => "3",            
         ),
         array(
           "animal" => "tiger",
           "location" => "bronx",
           "age" => "3",            
         ),
         array(
           "animal" => "panda",
           "location" => "San Diego",
           "age" => "2",            
         )
)

我想要做的是将其转换为一个关联数组,其中包含动物,位置和年龄的计数。所以,如果我想看看圣地亚哥有多少只熊猫,并且年龄为2岁,我将使用$newArray['panda']['San Diego']['2']访问新数组,输出为2。

我的问题是我可以轻松地运行循环并构建一个数组,并在完全静态的情况下计算项目。

foreach($array as $a) {

   $newArray[$a['animal']][$a['location']][$a['age']] += 1;

}

但是我想知道当键的数量是动态时如何实现相同的概念。例如,如果在一个电话中只有位置和动物,有时在另一个电话中可能有位置,动物,年龄和性别。

我发现有一些例子可以解释为关联数组执行此操作但不适用于具有此特定用例的多维数组。

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

想法

在我看来,你似乎想要一次性做太多事情。不要将数组转换为包含所有答案,而是考虑创建一个函数来对其运行查询。

解决方案

/**
 * @param array $animals The whole animals array
 * @param array $query Array containing keys and values you want to filter by
 *
 * @return array Animals that match $query
 */
function filterAnimals($animals, $query) {

    return array_filter($animals, function ($animal) use ($query) {
        // Check if $animal has every key and the corresponding value from $query
        foreach ($query as $key => $value) {
            if (!isset($animal[$key]) || $animal[$key] != $value) {
                return false;
            }
        }

        return true;
    });
}

filterAnimals()过滤了您的$animals数组,只返回具有$query数组的公用键和值的动物。搜索圣地亚哥的所有大熊猫将如下所示:

$result = filterAnimals($animals, [
    'animal' => 'panda',
    'location' => 'San Diego'
]);

然后,如果您愿意,可以计算$result

$count = count($result);