2017-02-06 14 views
0

私は多次元PHP配列を持ち、値に一致しない要素を(行ベースで)削除したい。例えばPHP - 値で多次元配列から削除

$user_types = [ 
    0 => ['ut_id' => 32, 'type' => 'admin'], 
    1 => ['ut_id' => 31, 'type' => 'user'], 
    2 => ['ut_id' => 801, 'type' => 'editor'] 
]; 

のは私だけ'type' == 'admin'要素をしたいとしましょう。

$user_types = [ 
    0 => ['ut_id' => 32, 'type' => 'admin'] 
] 

また、配列にキーが順番に入力されていることを確認する必要があります。だから私がほしいのであれば、type == 'editor'配列キーは0(2ではない)でなければならない。

$user_types = [ 
    0 => ['ut_id' => 801, 'type' => 'editor'] 
] 

私はPHP array delete by value (not key)を見て持っていたが、これは多次元配列を処理しません。

私はまた、foreachループを使用するいくつかのソリューションを見たことがありますが、これは非常に非効率的です。

誰かが見ている方向に私を指摘できますか? 多次元配列についてはこれを扱う例は見つけられません。私はDelete element from multidimensional-array based on valueを見ましたが、これは非効率的で約6年前に書かれました。

+0

私は多次元配列の検索に見て、そこから行くだろう。数値的に配列された配列は常に '0'で始まることに注意しましょう。キーが「2」の要素を1つ持つことはできません。 –

+1

http://php.net/manual/en/function.array-filter.phpを 'array_values'と組み合わせて使用​​します。 – jeroen

+1

@StuartWagnerはい、PHPの配列キーにそのような制限はありません。 – jeroen

答えて

2

あなたはここにPHPのarray_filter()機能を使用することができます。

<?php 
$user_types = [ 
    0 => ['ut_id' => 32, 'type' => 'admin'], 
    1 => ['ut_id' => 31, 'type' => 'user'], 
    2 => ['ut_id' => 801, 'type' => 'editor'] 
]; 

$type = 'admin'; 
print_r(
    array_values(
     array_filter($user_types, function($entry) use ($type){ 
      return $entry['type'] === $type; 
     }) 
    ) 
); 

$type = 'editor'; 
print_r(
    array_values(
     array_filter($user_types, function($entry) use ($type){ 
      return $entry['type'] === $type; 
     }) 
    ) 
); 

を上記のコードの出力は次のとおりです。

Array 
(
    [0] => Array 
     (
      [ut_id] => 32 
      [type] => admin 
     ) 

) 
Array 
(
    [0] => Array 
     (
      [ut_id] => 801 
      [type] => editor 
     ) 

) 
+0

完璧かつ非常に効率的に動作します、ありがとうございます。 SOが私に許可するときに数分で答えとして受け入れるだろう:) – Andy