从关联数组的数组中获取一个属性的唯一值

9

我有一个这样的数组:

$a = array(
    0 => array('type' => 'bar', 'image' => 'a.jpg'),
    1 => array('type' => 'food', 'image' => 'b.jpg'),
    2 => array('type' => 'bar', 'image' => 'c.jpg'),
    3 => array('type' => 'default', 'image' => 'd.jpg'),
    4 => array('type' => 'food', 'image' => 'e.jpg'),
    5 => array('type' => 'food', 'image' => 'f.jpg'),
    6 => array('type' => 'food', 'image' => 'h.jpg')
)

我怎样才能找出唯一的类型值(这些值可能是食物、酒吧和默认值)?我可以通过foreach循环迭代数组,但有没有更好的方法呢?

5个回答

18

在PHP >= 5.3中使用匿名函数:

$unique_types = array_unique(array_map(function($elem){return $elem['type'];}, $a));

对于早期版本,您可以声明一个单独的函数:

function get_type($elem)
{
    return $elem['type'];
}

$unique_types = array_unique(array_map("get_type", $a));

18

不确定为什么这个回答有+5个赞,它是一个聪明的解决方案,但并不是非常直接。 - Ryan
3
这个问题怎么才能更加“直截了当”?这看起来已经非常简单了。应该欣赏使用新版本语言中可用的更新功能,而不是为此感到困惑。 - Hanky Panky
对于1. 不得不查找 array_* 的功能、返回值、是否通过引用修改数组等信息。这只是一个巧妙的解决方案,没什么其他可说的了。请不要对此太过敏感。 - Ryan
所以如果有人需要查找为什么不应该这样做,他们为什么不能呢?这就像在21世纪使用泥桶来冷却水一样,只是因为我不想阅读昨天刚买的冰箱的功率规格 :) 另外,即使OP提到他们想要的不是老派的方法。 - Hanky Panky
不是什么个人问题,只是关于是否使用语言新版本中提供的新工具的小讨论。你有权发表自己的观点,就像其他人一样,所以没有任何问题 :) - Hanky Panky
显示剩余2条评论

3

一种不使用花哨的array_*函数的旧方法。这种方法简单易懂。你不会感到困惑,因为它非常直观。

$a = array(
    0 => array('type' => 'bar', 'image' => 'a.jpg'),
    1 => array('type' => 'food', 'image' => 'b.jpg'),
    2 => array('type' => 'bar', 'image' => 'c.jpg'),
    3 => array('type' => 'default', 'image' => 'd.jpg'),
    4 => array('type' => 'food', 'image' => 'e.jpg'),
    5 => array('type' => 'food', 'image' => 'f.jpg'),
    6 => array('type' => 'food', 'image' => 'h.jpg')
);

$types = array();

foreach($a as $key => $type) {
        if(! isset($types[$type['type']]))
                $types[$type['type']] = $type['type'];
}

var_dump($types);

实际上,由于任何提供输入数组复制的array_*函数之一,因此其中最快的答案之一。语言结构更好。 - BlitZ
很有趣,你提到了语言结构,因为在我阅读你的评论之前,我刚刚在另一个答案中发表了关于语言结构的评论。 - Ryan

0

你也可以使用array_reduce。

如果属性的值是数组或对象,则此方法无法工作,因为这些值不能设置为数组的键。

function array_unique_attr($arr, $key) {

    return array_keys( array_reduce($arr, function($newArr, $event) {

        $newArr[$key] = true;
        return $newArr;

    }, []) );

}

$unique_types = array_unique_attr($a, 'type');

0
尝试一下
$uniqueA = array_unique($a, "type");
// then to output the array just type
print_r($uniqueA);

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