【问题标题】:Multidimensional Array - Get unique values, but count all duplicates多维数组 - 获取唯一值,但计算所有重复项
【发布时间】:2016-03-31 22:04:07
【问题描述】:

我有一个多维数组,我想从中获取唯一的子值,但还要计算这些唯一子值出现的次数。

例如,这将是我的起始数组:

[0] => Array
        (
            [0] => Array
                (
                    [id] => 1533438473619168
                )
            [1] => Array
                (
                    [id] => 3333333333333333
                )
        )
 [1] => Array
        (
            [0] => Array
                (
                    [id] => 1533438473619168
                )
            [1] => Array
                (
                    [id] => 5555555555555555
                )
        )
 [2] => Array
        (
            [0] => Array
                (
                    [id] => 1533438473619168
                )
            [1] => Array
                (
                    [id] => 77777777777777777
                )
        )

最后,我想要一个如下所示的数组:

[0] => Array
        (
            [0] => Array
                (
                    [id] => 1533438473619168
                    [count] => 3
                )
            [1] => Array
                (
                    [id] => 3333333333333333
                    [count] => 1
                )
            [2] => Array
                (
                    [id] => 5555555555555555
                    [count] => 1
                )
            [3] => Array
                (
                    [id] => 77777777777777777
                    [count] => 1
                )
        )

是否有任何通用/简单的方法可以做到这一点,而无需遍历每个值的第一个数组、比较/存储临时数组中的值、检查它们并添加到计数?

【问题讨论】:

  • 不,没有比这更简单的方法了。
  • 使用 id 作为新数组的键以避免比较/检查。然后您可以使用array_values 将其删除
  • 对于初学者,我会将所有数组合并在一起,然后您只需遍历一个数组。
  • 感谢您的所有帮助。我最终只是手动完成(并不难,正如我预期的那样,但比我希望的要麻烦)。

标签: php arrays multidimensional-array count numbers


【解决方案1】:

要获得这种精确的格式,您可能需要迭代当前数组并手动进行计数,但是 php 具有用于此类事情的 array_count_values() 和 array_unique() 函数:

http://php.net/manual/en/function.array-count-values.php

http://php.net/manual/en/function.array-unique.php

【讨论】:

    【解决方案2】:

    因为你只关心数组最深的值,所以使用array_walk_recursive 似乎适合这个。请注意,在回调中使用了对输出数组$counted 的引用。

    array_walk_recursive($ids, function($id, $k) use (&$counted) {
        $counted[$id] = isset($counted[$id]) ? $counted[$id] + 1 : 1;
    });
    

    使用 id 作为 $counted 数组中的键将简化计数。这样做的结果将与您建议的输出有所不同,但在我看来,它实际上更易于使用。 (例如foreach ($counted as $id => $count) {...)。

    $counted = array(
        "1533438473619168" => 3
        "3333333333333333" => 1
        "5555555555555555" => 1
        "77777777777777777" => 1);
    

    【讨论】:

    • 谢谢,我会试试这个,看看它是否比我当前的解决方案更有效,但两者似乎都使用临时数组进行存储和相同的代码行。
    猜你喜欢
    • 1970-01-01
    • 2010-12-29
    相关资源
    最近更新 更多