2017-09-05 4 views
4

良い夕方 - データベースに格納されたアカウントコードの分解されたテキスト文字列に基づいて多次元配列を作成しようとしています。アカウントコードの長さ/深さはさまざまです。以下の配列の例の$テストのために言って、私は、データベースから引っ張ってしまう結果と類似している:不確定な深さのPHPで多次元配列を作成する

$test = array( 
    '110|5100|120' => 'Teacher Salaries', 
    '110|5100|130' => 'Other Professoinal Services', 
    '110|5100|510|1' => 'Primary Supplies', 
    '110|5100|510|2' => 'Intermediate Supplies', 
    '110|7300|110' => 'Administrator Salaries', 
    '110|7300|510' => 'Administrative Supplies', 
    '763|5100'  => 'Academic Grants' 
); 
foreach($test AS $k => $v) { 
    $lvl = explode("|", $k); 
    // Not sure what to do next... 
} 

私は何をしたい、次のような配列を返す関数を作成することです:

[110] => Array 
    (
     [5100] => Array 
      (
       [120] => Teacher Salaries 
       [130] => Other Professional Services 
       [510] => Array 
        (
         [1] => Primary Supplies 
         [2] => Intermediate Supplies 
        ) 
      ) 
     [7300] => Array 
      (
       [110] => Administrator Salaries 
       [510] => Supplies 
      ) 
    ) 
[763] => Array 
    (
     [5100] => Academic Grants 
    ) 

私はコードのうちの1つを取り、それを配列に正しく分解することができる関数を考え出すことができましたが、それらを一緒にマージしようとすると、キーを失います。

function expandedArray($codes, $value) { 
    $decoded = explode("|",$codes); 
    RETURN expandedArraySub($decoded, $value); 
} 
function expandedArraySub($decoded = array(), $value = Null) { 
    $k = array_pop($decoded); 
    $out[$k] = $value; 
    if(is_array($decoded) && count($decoded) > 0) { $out = expandedArraySub($decoded, $out); } 
    RETURN $out; 
} 

をしかし、私は代わりに、前述したように、私が欲しいものを得るのは、次の手順を実行したとき、私はキー「110」失う配列を取得:

$r1 = expandedArray('110|5100|510|1', "Primary Supplies"); 
    // $r1 is now [ 110 => [5100 => [510 => [ 1 ] ] ] ] 
$r2 = expandedArray('110|5100|510|2', 'Intermediate Supplies'); 
    // $r2 is now [ 110 => [5100 => [510 => [ 2 ] ] ] ] 
$r = array_merge($r1, $r2); 
をここに私はこれまで持っているものです

私が得た結果は最初の鍵を取り除き、私が望んでいたように結果を結合しません。ここに私が得るものがあります:

[0] => Array 
    (
     [5100] => Array 
      (
       [510] => Array 
        (
         [1] => Primary Supplies 
        ) 
      ) 
    ) 
[1] => Array 
    (
     [5100] => Array 
      (
       [510] => Array 
        (
         [2] => Intermediate Supplies 
        ) 
      ) 
    ) 

何か助けてくれてありがとうございます!ありがとう!

+0

に記載されていて、数字キーで() '' array_mergeの行動を、このコードについての詳細を読み、悲しげにそれを変更するオプションはありません。すべての努力を続けたい場合は、expandedArraySubで '$ out ['x'。$ k] = $ value;を試してみてください。これにより、array_mergeはキーを文字列として扱います。私は 'array_merge'の代わりに' array_merge_recursive() 'もしたいと思います。もちろん、すべてのxを取り除く必要がありますが、それは簡単で作業はすべてあなたのものです。 – jh1711

答えて

1

は、このコードを試してみてください。

function getVal($data,$chain){ 
    $level = $data; 
    for($i=0;$i<count($chain);$i++){ 
     if(isset($level[$chain[$i]])) 
      $level = $level[$chain[$i]]; 
     else 
      return null; // key does not exist, return null 
    } 
    return $level; 
} 

function setVal(&$data,$chain,$value){ 
    $level = &$data; 
    for($i=0;$i<count($chain);$i++){ 
     $level = &$level[$chain[$i]]; // set reference (&) in order to change the value of the object 
    } 
    $level = $value; 
} 

このようにそれを使用する設定の場合:希望の形式を持っている必要があり

$output = array(); 
$test = array( 
    '110|5100|120' => 'Teacher Salaries', 
    '110|5100|130' => 'Other Professoinal Services', 
    '110|5100|510|1' => 'Primary Supplies', 
    '110|5100|510|2' => 'Intermediate Supplies', 
    '110|7300|110' => 'Administrator Salaries', 
    '110|7300|510' => 'Administrative Supplies', 
    '763|5100'  => 'Academic Grants' 
); 
foreach($test AS $k => $v) { 
    $lvl = explode("|", $k); 
    setVal($output,$lvl,$v); 
} 

$output

my previous post

+0

素晴らしい作品です、ありがとうございます! –