2010-08-25 71 views
0

我有一個多維數組,子數組由更多的值組成,我希望所有隻有一個值的子數組被轉換爲一個字符串。如何成功掃描多維數組以獲得結果?將只有一個值的子數組轉換爲字符串

下面是數組的一小部分,因爲它是現在。

[1] => Array 
(
    [name] => Array 
     (
      [0] => Person's name 
     ) 

    [organisation] => Array 
     (
      [0] => This is their organisation 
      [1] => aka something else 
     ) 

    [address] => Array 
     (
      [0] => The street name 
      [1] => The town name 
     ) 

    [e-mail] => Array 
     (
      [0] => [email protected] 
     ) 

) 

,這裏是我怎麼想它最終

[1] => Array 
(
    [name] => Person's name 

    [organisation] => Array 
     (
      [0] => This is their organisation 
      [1] => aka something else 
     ) 

    [address] => Array 
     (
      [0] => The street name 
      [1] => The town name 
     ) 

    [e-mail] => [email protected] 

) 

回答

0

無論數組有多深,這都應該可以工作。

將這個功能在你的代碼:

function array2string(&$v){ 
    if(is_array($v)){ 
     if(count($v, COUNT_RECURSIVE) == 1){ 
      $v = $v[0]; 
      return; 
     } 
     array_walk($v, 'array2string'); 
    } 
} 

那麼做到這一點:

array_walk($array, 'array2string'); 
+0

非常感謝火箭!完美地工作! – Paul 2010-08-30 17:59:58

1

這應該做的伎倆。

function array2string(&$v){ 
    if(is_array($v) && count($v)==1){ 
     $v = $v[0]; 
    } 
} 
array_walk($array, 'array2string'); 

或作爲一個單線,因爲我瘋了。

array_walk($array, create_function('&$v', 'if(is_array($v) && count($v)==1){$v = $v[0];}')); 

EDIT:它看起來像該陣列是在一個更大的陣列的元件。你需要把這個函數放在一個foreach循環中。

function array2string(&$v){ 
    if(is_array($v) && count($v)==1){ 
     $v = $v[0]; 
    } 
} 
foreach($array as &$val){ 
    array_walk($val, 'array2string'); 
} 

或使用我的瘋狂create_function單行。

foreach($array as &$val){ 
    array_walk($val, create_function('&$v', 'if(is_array($v) && count($v)==1){$v = $v[0];}')); 
} 
+0

這不起作用,結果數組看起來好像沒有改變,即使單個項仍然被設置爲數組。 – Paul 2010-08-25 20:17:13

+0

嘗試循環訪問數組,並在每個元素上使用'array_walk'。 – 2010-08-25 20:22:32

+0

我也試過,也沒有喜樂,很奇怪。 – Paul 2010-08-25 20:31:28

0

此PHP 5.3的代碼使用了閉。如果需要,也可以使用命名函數。它專門檢查字符串,並調用自己的嵌套數組。

<?php 
array_walk($array, $walker = function (&$value, $key) use (&$walker) { 
    if (is_array($value)) { 
     if (count($value) === 1 && is_string($value[0])) { 
      $value = $value[0]; 
     } else { 
      array_walk($value, $walker); 
     }  
    } 
});