【问题标题】:Counting Items Inside Multidimensional Associative Array计数多维关联数组中的项目
【发布时间】:2016-08-31 13:00:27
【问题描述】:

所以我在 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;

}

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

我发现有一些示例说明了对关联数组执行此操作,但不适用于具有此特定用例的多维数组。

有什么想法吗?

【问题讨论】:

    标签: php multidimensional-array associative-array


    【解决方案1】:

    理念

    在我看来,您好像一次尝试做太多事情。与其将数组转换为包含所有答案,不如考虑创建一个函数来针对它运行查询。

    解决方案

    /**
     * @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 数组具有公共键和值的动物。搜索来自圣地亚哥的所有 pandas 如下所示:

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

    那么,如果你愿意,你可以数一下$result:

    $count = count($result);
    

    【讨论】:

    • 我同意这个替代解决方案。试图只用数组来做这件事就像用锤子拍苍蝇一样。
    猜你喜欢
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2012-01-07
    • 2017-05-08
    • 2021-04-24
    • 2021-05-23
    相关资源
    最近更新 更多