0

如何在 N 维数组中的每个元素之前添加一个额外的维度(递归)?假设我有

Array
(
    [room] => Array
        (
            [bed] = Array
                (
                    [material] => wood
                )
        )
)

我想在房间、床和材料之前添加一个额外的“[0]”维度。(仅当最后一个元素是数组时才添加维度)。我还想区分,如果已经有额外的 [0] 维度,那么它不会出现两次.. + 如果数组键名为“@attribute”,我不想添加 [0]。

我想弄清楚,但我真的迷路了。这是我到目前为止所得到的..

function normalize_array (&$array) {
    if (is_array($array)) {
        if (!isset($array[0])) {
            $array = array ( "0" => $array);
        }
        foreach ($array[0] as $next) {
            normalize_array ($next);
        }
    }
}

但它不能递归地工作。任何帮助将不胜感激。谢谢!

4

3 回答 3

3

foreach 的文档中

In order to be able to directly modify array elements within the loop
precede $value with &. In that case the value will be assigned by reference.

因此,如果您像这样修改函数,它会起作用:

function normalize_array (&$array) {
    if (is_array($array)) {
        if (!isset($array[0])) {
            $array = array ( "0" => $array);
        }
        foreach ($array[0] as &$next) { // <-- add & here
            normalize_array ($next);
        }
    }
}
于 2014-03-09T23:06:28.273 回答
2

可能的解决方案(只测试了一点,但似乎有效):

function normalize_array($array, $keys){
  $new = array();
  foreach($array as $key => $value){
    if (in_array($key, $keys) && is_array($value)){
      $new["0"] =  array($key => normalize_array($value, $keys));
    } else {
      $new[$key] = $value ;
    }
  }
  return $new ;
}

$data = array(
 "room" => array(
        "bed" => array(
            "material" => "wood"
        )
    )
);


$keys = array("room", "bed", "material");

$new = normalize_array($data, $keys);
var_dump($new);
于 2014-03-09T23:03:53.833 回答
0

最终解决方案:

function normalize_array_rec (&$array) {
        if (is_array($array)) {
                if (!isset($array[0])) {
                        $array = array ( "0" => $array);
                }
                $i = 0;
                while (isset($array[$i])) {
                        foreach ($array[$i] as &$next) {
                                normalize_array_rec ($next);                           
                        }
                        $i++;                          
                }              
        }
}

忘记在数组的每个实例中调用函数,不仅在 [0] 索引中。

于 2014-03-10T19:47:22.313 回答