2011-07-10 11 views
0

配列内にキー名として "foo.bar.baz"という配列があります。この配列を多次元配列に変換する便利な方法はありますか(各 "ドットレベル"を次の配列のキーとして使用します)?多次元配列への配列...配列キー名のfoo.bar.baz-dotsに基づいて

  • 実際の出力:配列([foo.bar.baz] => 1、[qux] => 1)
  • 所望の出力:配列([FOO] [バー] [バズ] => 1、 【qux] => 1)

コードの例:

$arr = array("foo.bar.baz" => 1, "qux" => 1); 
print_r($arr); 

答えて

3

対処:

<?php 

$arr = array('foo.bar.baz' => 1, 'qux' => 1); 

function array_dotkey(array $arr) 
{ 
    // Loop through each key/value pairs. 
    foreach ($arr as $key => $value) 
    { 
    if (strpos($key, '.') !== FALSE) 
    { 
     // Reference to the array. 
     $tmparr =& $arr; 

     // Split the key by "." and loop through each value. 
     foreach (explode('.', $key) as $tmpkey) 
     { 
     // Add it to the array. 
     $tmparr[$tmpkey] = array(); 

     // So that we can recursively continue adding values, change $tmparr to a reference of the most recent key we've added. 
     $tmparr =& $tmparr[$tmpkey]; 
     } 

     // Set the value. 
     $tmparr = $value; 

     // Remove the key that contains "." characters now that we've added the multi-dimensional version. 
     unset($arr[$key]); 
    } 
    } 

    return $arr; 
} 

$arr = array_dotkey($arr); 
print_r($arr); 

出力:

Array 
(
    [qux] => 1 
    [foo] => Array 
     (
      [bar] => Array 
       (
        [baz] => 1 
       ) 

     ) 

) 
+0

+1私はそれを把握することができませんでした:) – AlienWebguy

+0

ニース。それを関数に入れることはできますか? array_dotkey($ value、&$ tmparr){...} –

+0

のようなもの@Kristoffer Bohmann - もちろん可能ですが、配列を受け入れる関数の作成をお勧めします。私は答えを更新します。 –