2016-10-12 6 views
1

特定のキーに対して重複値が見つかった場合、多次元配列から子配列を削除したいと考えています。 answer(s) hereはまったく動作しませんでした。しかし、大量の配列の場合はanswer hereが動作しますが、かなり遅くなります。よりクリーンで高速なソリューションを探してください。Aキーの値が重複している場合に子配列を削除する

例PHPアレイ

$args = array(); 

    $args[] = array(
     'section' => array(
      'id' => 'section1', 
      'name' => 'Section 1', 
     ), 
     'name' => 'Shortcode Name', 
     'action' => 'shortcodeaction', 
     'icon' => 'codeicon', 
     'image' => 'codeimage', 
    ); 
    $args[] = array(
     'section' => array(
      'id' => 'section2', 
      'name' => 'Section 2', 
     ), 
     'name' => 'Shortcode2 Name', 
     'action' => 'shortcodeaction2', 
     'icon' => 'codeicon2', 
     'image' => 'codeimage2', 
    ); 
    $args[] = array(
     'section' => array(
      'id' => 'section3', 
      'name' => 'Section 3', 
     ), 
     'name' => 'Shortcode3 Name', 
     'action' => 'shortcodeaction3', 
     'icon' => 'codeicon3', 
     'image' => 'codeimage3', 
    ); 
    $args[] = array(
     'section' => array(
      'id' => 'section1', 
      'name' => 'Section 4', 
     ), 
     'name' => 'Shortcode4 Name', 
     'action' => 'shortcodeaction4', 
     'icon' => 'codeicon4', 
     'image' => 'codeimage4', 
    ); 
    $args[] = array(
     'section' => array(
      'id' => 'section5', 
      'name' => 'Section 5', 
     ), 
     'name' => 'Shortcode5 Name', 
     'action' => 'shortcodeaction5', 
     'icon' => 'codeicon5', 
     'image' => 'codeimage5', 
    ); 

    $sections = array(); 

    foreach ($args as $arg) { 
     $sections[] = $arg['section']; 
    } 

そして、print_r($sections)結果。

Array 
(
    [0] => Array 
     (
      [id] => section1 
      [name] => Section 1 
     ) 

    [1] => Array 
     (
      [id] => section2 
      [name] => Section 2 
     ) 

    [2] => Array 
     (
      [id] => section3 
      [name] => Section 3 
     ) 

    [3] => Array 
     (
      [id] => section1 
      [name] => Section 4 
     ) 

    [4] => Array 
     (
      [id] => section5 
      [name] => Section 5 
     ) 

) 

両方Array[0]Array[3]キーidに対して同じ値を有し、その全体Array[3]は、重複を避けるために、私の場合に除去されなければなりません。

これは私のために働いていますが、100s以上の配列がある場合は非常に遅くなります。

$knownIds = array(); 
    foreach($sections AS $key=>$item) { 
     if(array_key_exists($item['id'], $knownIds) === true) { 
     unset($sections[$key]); 
     } else { 
     $knownIds[$item['id']] = $key; 
     } 
    } 
    $sections = array_values($sections); 

はこちら(thisを含む)のStackOverflowでいくつかの答えを試みたが、それらのどれも私の場合には役立っていません。

おかげ

あなたが array_columnarray_filter使用して全体を変更することができ
+0

可能な重複[多次元から重複する値を削除する方法PHPの配列](http://stackoverflow.com/questions/307674/how-to-remove-duplicate-values-from-a-multi-dimensional-array-in-php) – Epodax

答えて

1

- PHP <について

//get all the sections value 
$section = array_column($args, 'section'); 

//store ids in temp array 
$idArray = array_unique(array_column($section, 'id')); 
//filter the array having unique id 
$uniqueSections = array_filter($section, function ($key, $value) use ($idArray) { 
    return in_array($value, array_keys($idArray)); 
}, ARRAY_FILTER_USE_BOTH); 

var_dump($uniqueSections); 

を5.5

$section = array_map(function($args) { 
      return $args['section']; 
      }, $args); 

$idArray = array_unique(array_map(function($section){return $section['id'];}, $section)); 
+0

致命的なエラーの取得:致命的なエラー:/XXXX/XXXX/XXX/editor.phpの未定義関数array_column()を呼び出します。私はPHP 5.4.45を使用しています – Abhik

+0

それは> 5.5で追加されました。 foreachや 'array_map'を使うと良いでしょう。 – jitendrapurohit

+0

しかし、まだ' $ idArray = array_unique(array_column($ section、 'id')); 'に' array_column'が残っているので、この致命的なエラーが発生します。 – Abhik

関連する問題