在数组的一列中计算唯一值

3

我有一个这样的数组:

$arr = [
    1 => ['A' => '1', 'C' => 'TEMU3076746'],
    2 => ['A' => '2', 'C' => 'FCIU5412720'],
    3 => ['A' => '3', 'C' => 'TEMU3076746'],
    4 => ['A' => '4', 'C' => 'TEMU3076746'],
    5 => ['A' => '5', 'C' => 'FCIU5412720']
];

我的目标是计算二维数组中 C 列的不同值的数量。

可以通过以下方式找到数组中的总行数:count($arr) (这是 5)。

如何计算包含'C'列中唯一值的行数?

如果移除了C列中的重复值,那么只剩下: TEMU3076746FCIU5412720

因此我的期望输出结果是 2

5个回答

5

2
只是说一下,你也可以在这里使用 array_flip 来代替 array_unique。+1 - Thamilhan
2
这是一些非常黑暗邪恶的使用 array_flip 的方式...只要值是字符串或整数,它就能工作。 - Jakumi

2

结合使用 array_map, array_uniquecount 函数。

$array = [ /* your array */ ];
$count = count(
    array_unique(
        array_map(function($element) { 
            return $element['C']; 
        }, $array))))

或者按照 Sahil Gulati 的建议使用 array_column,array_map 可以做更多的事情,但可能在这里并不需要。


1
我有一个非常类似的需求,我使用了稍微不同的方法。
我有几个团队参加的事件,我需要知道每个事件中有多少个团队。换句话说,我不仅需要知道有多少个不同的项目“C”,还需要知道有多少个项目TEMU3076746FCIU5412720
代码将保持不变。
$nbCs = array_count_values ( array_column ( $array, 'C' ) );

$nbCs将发出一个数组,其中values = Array([TEMU3076746] => 3 [FCIU5412720] => 2)

在沙箱中查看示例Sandbox code


这个答案存在两个问题:1.比任务所需的计数工作更多;2.未计算生成的元素。因此需要额外调用count()函数。 - mickmackusa

0
$data=array();
$data=[
       1 => [
             'A' => '1'
             'C' => 'TEMU3076746'
            ]

       2 => [
             'A' => '2'
             'C' => 'FCIU5412720'
            ]

       3 => [
             'A' => '3'
             'C' => 'TEMU3076746'
            ]
       
       4 => [
            'A' => '4'
            'C' => 'TEMU3076746'
            ]

       5 => [
             'A' => '5'
             'C' => 'FCIU5412720'
           ]
        ];

 $total_value=count(
    array_unique(
            array_column($data,"C")));
echo $total_value;

3
只有当您对页面有独特而有价值的贡献时,请添加答案。此内容与信息技术相关。 - mickmackusa

0
最简洁的方法是使用array_column()的特殊功能,使用目标列的值分配新的第一级键。这提供了所需的唯一性效果,因为数组不能在同一级别上包含重复的键。
代码:(演示
echo count(array_column($arr, 'C', 'C')); // 2

要非常清楚,array_column($arr, 'C', 'C') 会产生以下结果:
array (
  'TEMU3076746' => 'TEMU3076746',
  'FCIU5412720' => 'FCIU5412720',
)

这也可以使用 array_column($arr, null, 'C'),但会创建一个更大的临时数组。


p.s. 有一个边缘情况可能会让正在寻找唯一浮点值的研究人员感到担忧。使用浮点值分配新的关联键是不合适/容易出错的,因为键将失去精度(变为截断为整数)。

在那种带有浮点数的边缘情况中,回退到不太高效的技术:count(array_unique(array_column($arr,'B'))) 演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接