计算多维关联数组内的项目

wmf*_*cia 4 php associative-array multidimensional-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",            
         )
)
Run Code Online (Sandbox Code Playgroud)

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

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

foreach($array as $a) {

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

有什么想法吗?

Kub*_*cki 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;
    });
}
Run Code Online (Sandbox Code Playgroud)

filterAnimals()过滤您的$animals数组并仅返回具有公共键和$query数组的动物.搜索圣地亚哥的所有大熊猫将如下所示:

$result = filterAnimals($animals, [
    'animal' => 'panda',
    'location' => 'San Diego'
]);
Run Code Online (Sandbox Code Playgroud)

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

$count = count($result);
Run Code Online (Sandbox Code Playgroud)