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

}
4

3 に答える 3

3

それらを配列に追加するときに$tmp、キーをアーティストの名前に指定できます。次に、isset($tmp[$performer['name']])true かどうかを確認し、既に存在する場合はスキップできます。そうすれば、内側のループを回避できます。$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'
     )
);
于 2013-08-03T01:19:30.500 に答える
2

アーティスト ID を気にしないのに、組み込み関数array uniqueを使用できないのはなぜですか?

于 2013-08-03T01:08:36.337 に答える
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
        )

)
于 2013-08-03T01:32:13.963 に答える