2013-08-03 73 views
3

我已經寫了一個簡單的算法,只存儲名稱的第一次出現在我的藝術家陣列中。我不關心藝術家ID。該算法工作正常,但我擔心性能。有沒有人看到一個更簡單的方法來寫這個,如果$ performers數組是200名藝術家,這也會提高性能?Array基於索引刪除重複/保留第一次發生

$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; 
    } 

} 

回答

0

如果你不與當時的藝術家ID有關否則:

$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 
     ) 

) 
+0

。所以你第二個選項看起來比我的好 – Sixthpoint

2

爲什麼不能使用內置函數array unique,因爲您不關心藝術家ID?

+0

與它的最終結果,但不是我所關心的只是對最終結果的ID的初始排序 – Sixthpoint

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; 
    } 
} 

你會得到這樣的:

$tmp = array_unique(array_map(function($value) { 
       return $value["name"]; 
      }, $performers)); 

的結果將是::

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

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