基于索引删除数组中的重复项/保留第一个出现的项

3

我已经编写了一个简单的算法,只在我的艺术家数组中存储名称的第一个出现。我不关心艺术家ID。算法运行良好,但我担心性能。如果$performers数组包含200位艺术家,有人看到更简单的编写方式并提高性能吗?

$performers = array(
   array('id' => '12','name' => 'Grouplove'),
   array('id' => '24','name' => 'Grouplove'),
   array('id' => '43','name' => 'Coldplay')
);

$tmp = array();
foreach($performers as $performer)
{
   $count = 0;
   foreach($tmp as $test)
   {
      if($performer['name'] == $test['name'])
      {
         $count++;
      }
   }
   if(!$count)
   {
      $tmp[] = $performer;
   }

}
3个回答

3

将它们添加到$tmp数组时,您可以指定键为艺术家的名称。然后,您可以仅检查isset($tmp[$performer['name']])是否为真,并在已存在时跳过它。这样,您就可以避免内部循环。在填充新的$tmp数组后,如果键是问题,您可以使用array_values($tmp)获取仅值。

$tmp = array();
foreach($performers as $performer) {
  if(!isset($tmp[$performer['name']]){
    $tmp[$performer['name']] = $performer;
  }
}

您将会得到类似于以下内容的东西:
array(
    'Grouplove' => array(
            'id' => '12',
            'name' => 'Grouplove',
     ),
    'Coldplay'  =>array(
            'id' => '43',
            'name' => 'Coldplay'
     )
);

2
为什么你不能使用内置函数array_unique,既然你不关心艺术家ID呢?

最终结果与初始排序无关,只关注最终结果。 - Sixthpoint

0
如果您不关心艺术家ID,则:
$tmp = array_unique(array_map(function($value) {
                return $value["name"];
            }, $performers));

结果将是:

Array
(
    [0] => Grouplove
    [2] => Coldplay
)

否则:
$tmp = array();
foreach($performers as $performer) {
    if(!in_array($performer["name"], array_map(function($value) {
                return $value["name"];
            }, $tmp))) {
        $tmp[] = $performer;
    }
}

结果将会是:

Array
(
    [0] => Array
        (
            [id] => 12
            [name] => Grouplove
        )

    [1] => Array
        (
            [id] => 43
            [name] => Coldplay
        )

)

我只关心最终结果上的ID。所以你的第二个选项比我的更好。 - Sixthpoint

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