2010-08-25 75 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); 
     }  
    } 
});