2017-09-20 10 views
3

ドット区切りキーで特定のサブ配列を削除したいと思います。ここではいくつかの作業です(はい、それ取り組んでいるが、素敵な解決策にさえ近くない)コード:この上より素敵な解決策のためのドット区切りキーで多次元配列のサブツリーを削除します

$Data = [ 
       'one', 
       'two', 
       'three' => [ 
        'four' => [ 
         'five' => 'six', // <- I want to remove this one 
         'seven' => [ 
          'eight' => 'nine' 
         ] 
        ] 
       ] 
      ]; 

      # My key 
      $key = 'three.four.five'; 
      $keys = explode('.', $key); 
      $str = ""; 
      foreach ($keys as $k) { 
       $sq = "'"; 
       if (is_numeric($k)) { 
        $sq = ""; 
       } 
       $str .= "[" . $sq . $k . $sq . "]"; 
      } 
      $cmd = "unset(\$Data{$str});"; 
      eval($cmd); // <- i'd like to get rid of this evil shit 

任意のアイデア?

答えて

1

配列内の要素への参照を使用して、$keys配列の最後のキーを削除することができます。

キーが実際に存在する場合は、いくつかのエラーチェック/ハンドリングを追加する必要がありますが、これは基本である:

$Data = [ 
      'one', 
      'two', 
      'three' => [ 
       'four' => [ 
        'five' => 'six', // <- I want to remove this one 
        'seven' => [ 
         'eight' => 'nine' 
        ] 
       ] 
      ] 
]; 

# My key 
$key = 'three.four.five'; 
$keys = explode('.', $key); 

$arr = &$Data; 
while (count($keys)) { 
    # Get a reference to the inner element 
    $arr = &$arr[array_shift($keys)]; 

    # Remove the most inner key 
    if (count($keys) === 1) { 
     unset($arr[$keys[0]]); 
     break; 
    } 
} 

var_dump($Data); 

A working example

+0

で、ありがとう、これはうまく:) – Link

1

referencesを使用してこれを行うことができます。変数の設定を解除することはできませんが、unset a array keyとすることができます。

ソリューションは、次のコード

# My key 
$key = 'three.four.five'; 
$keys = explode('.', $key); 
// No change above here 


// create a reference to the $Data variable 
$currentLevel =& $Data; 
$i = 1; 
foreach ($keys as $k) { 
    if (isset($currentLevel[$k])) { 
     // Stop at the parent of the specified key, otherwise unset by reference does not work 
     if ($i >= count($keys)) { 
      unset($currentLevel[$k]); 
     } 
     else { 
      // As long as the parent of the specified key was not reached, change the level of the array 
      $currentLevel =& $currentLevel[$k]; 
     } 
    } 
    $i++; 
} 
+0

ワークス作品、ありがとう:) – Link

関連する問題