2016-12-10 9 views
0

私はデータを持つ構造化配列を持っており、ノードXに追加データを追加する必要があります。ノードXは、他の配列($ path)のパスで指定されます。ツリー内の特定の位置に新しいデータを含める

$data = [ 
183013 => 
    [ 
     183014 => [ 
      183018, 
      183019 => [ 
       183021, 
       183022 => [ 
        183023 
       ] 
      ], 
      183020 
     ], 
     183016, 
     183017 
    ] 
]; 

$path = [183013, 183014, 183019, 183021]; 
$new_data = [183030 => [183031]]; 

だから、私は$データまたは$パスの深さは無制限である要素183021. に$ NEW_DATAを追加する必要があります。 phplab.io/lab/iwnXI

で再生するためにいくつかの回では

+0

です? – RomanPerekhrest

+0

array_pushメソッドを検索して試してみることができます – C2486

+0

数字が一意ではないと思います – EugenA

答えて

1

私はこれを作成しました:

データ

<?php 
$data = [ 
    183013 => [ 
     183014 => [ 
      183018, 
      183019 => [ 
       183021, 
       183022 => [ 
        183023 
       ] 
      ], 
      183020 
     ], 
     183016, 
     183017 
    ] 
]; 

$path = [183013, 183014, 183019, 183021]; 

$new_data = [183030 => [183031]]; 

ソリューション1 - 再帰関数

はにデータを提供します各ノードが追加されます。それはトリックのevalモード

、および -

var_dump(appendIntoArrayTree($data, $path, $new_data)); 

解決方法2: は、我々は(つまり、 '0 => 183020')

<?php function appendIntoArrayTree(array $source, array $path, array $values) { 
    $key = array_shift($path); 

    if (isset($source[$key]) && is_array($source[$key])) { 
     $source[$key] = appendIntoArrayTree($source[$key], $path, $values); 
    } 
    else { 
     // search if the current $path key exist as 'value' on the $source (i.e.: '0 => 183021') 
     if(!is_null($foundKey = array_search($key, $source))) { 
      unset($source[$foundKey]); 
     } 
     $source[$key] = $values; // final 
    } 

    return $source; 
} 

と出力の最終数値を削除する必要があります私はそれを使用することを奨励していません(さらに、一部のサーバーでは、eval()の使用を許可しません)

function appendIntoArrayTreeWithEval(array $source, array $path, array $values) { 
    $path_last = $path[count($path) - 1]; 
    $path_string = implode('', 
     array_map(function($v) { 
     return '[' . $v . ']'; 
     }, array_slice($path, 0, count($path) - 1)) 
    ); // Convert $path = ['a', 'b', 'c'] to string [a][b] (last 'c' not used) 

    $tmp = null; 
    eval('$tmp = isset($source' . $path_string . ') ? $source' . $path_string . ' : null;'); 
    if(is_null($tmp)) { 
     // $source[a][b] does not exists 
     eval('$source' . $path_string . '[' . $path_last . '] = $values;'); 
    } 
    else if(is_array($tmp)) { 
     if(!is_null($key = array_search($path_last, $tmp))) { 
      // key exists with 'numeric' array key value (0 =>, 1 =>, ...) 
      eval('unset($source' . $path_string . '[' . $key . ']);'); // remove 
     } 
     eval('$source' . $path_string . '[' . $path_last . '] = $values;'); 
    } else { 
     // is string/numeric/... Error. SHould not use 0/1/2 ... values 
    } 
    return $source; 
} 

と出力

var_dump(appendIntoArrayTreeWithEval($data, $path, $new_data)); 

ソリューション1は右、すべての数字がユニークで最高:)

(我々はまた、array merge recursive機能を試してみましたが、それは動作しません)

関連する問題