2017-05-08 40 views
1

我有這樣的陣列:PHP拼合多維數組轉換成字符串

$input_array = array(
    'one' => array(
      'two' => '3', 
      'four' => array(5,6,7) 
     ), 
    'eight' => array(
      'nine' => array(
        'ten' => '11' 
       ) 
     ) 

); 

我所要的輸出是:

one/two:3 
one/four/0:5 
one/four/1:6 
one/four/2:7 
eight/nine/ten:11 

我已成功地使該功能/代碼:

function flatten($array) { 
    if (is_array($array)) { 
     //get the key and value pair of the array 
     foreach ($array as $key => $value) { 

      if (is_array($value)) { 
       echo $key.'/'; 
      } else { 
       echo $key.":".$value."<br/>\n"; 
      } 

      flatten($value); 
     } 

    } else { 
     return false; 
    } 


} 

flatten($input_array); 

目前輸出:

one/two:3 
four/0:5 
1:6 
2:7 
eight/nine/ten:11 

第一行和最後一行都是正確的,但在中間不是我想要的輸出,我知道我很近,只需要更多的修改。任何人都可以幫忙謝謝!

回答

3

保存路徑,直到葉項,然後附和:

function flatten($array, $prefix='') { 
    if (is_array($array)) { 
     //get the key and value pair of the array 
     foreach ($array as $key => $value) { 

      if (is_array($value)) { 
       // call with `path to this array` 
       flatten($value, $prefix . $key.'/'); 
      } else { 
       echo $prefix.$key.":".$value."<br/>\n"; 
      } 
     } 
    } else { 
     return false; 
    } 
} 

demo on eval.in

+0

我知道我很近,謝謝你!沒有想到添加另一個變量,所以我可以存儲舊的密鑰,我實際上正在做它,但沒有添加前綴的功能,但在循環內,它輸出錯誤!標記爲解決方案! – Knide

+0

你不能收集沒有收集,因爲你得到一個關鍵一次循環,但需要多次回聲它的後代葉項目。很高興你幫忙。祝你好運! – splash58

0

您可以實現一個簡單的遞歸策略:

<?php 
$input = [ 
    'one' => [ 
     'two' => '3', 
     'four' => [5, 6, 7 ] 
    ], 
    'eight' => [ 
     'nine' => [ 
      'ten' => '11' 
     ] 
    ] 
]; 

$output = []; 
$path = []; 

function createPath($entry, $path, &$output) { 
    if (is_array($entry)) { 
     foreach ($entry as $key => $value) { 
      createPath($value, array_merge($path, [$key]), $output); 
     } 
    } else { 
     $output[] = implode('/', $path) . ':' . $entry; 
    } 
}; 

createPath($input, $path, $output); 

print_r($output); 

以上代碼的輸出顯然是:

Array 
(
    [0] => one/two:3 
    [1] => one/four/0:5 
    [2] => one/four/1:6 
    [3] => one/four/2:7 
    [4] => eight/nine/ten:11 
) 
+0

如果我想顛倒陣列輸出並將其恢復到原始的多維狀態,該怎麼辦? – Knide

+0

我建議你簡單地保持原來的數組結構的某處;-) – arkascha

+0

大聲笑!只是一個場景,如果我得到一個平面數組,然後需要將它變成一個多維數組,那該怎麼辦?我實際上發佈了一個新問題,但它被標記爲重複。 http://stackoverflow.com/questions/43844723/flat-array-to-multi-dimensional-based-on-the-array-key?noredirect=1 – Knide