0

N次元配列の各要素の前に(再帰的に)次元を追加するにはどうすればよいですか? 私が持っているとしましょう

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

そして、部屋、ベッド、素材の前に「[0]」次元を追加したいと思います。(最後の要素が配列の場合にのみ次元を追加します)。また、余分な [0] ディメンションが既に存在する場合は区別したいので、2 回表示されることはありません.. + 配列キーの名前が「@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 に答える