0

私はこのような配列を持っています:

Array
{
   'property1.subproberty11' => "xxxxx",
   'property1.subproberty12' => "yyyy",
   'property2.subproberty21.subproperty211' => "zzzzzz",
   'property2.subproberty21.subproperty212' => "wwwww",
   'property2.subproberty22' => "yyyy",
   ....

次のように変更する必要があります。

Array
(
[property1] => Array
    (
            ['subproberty11'] => "xxxxx"
            ['subproberty12'] => "yyyy"
    )

[property2] => Array
    (
        [subproperty21] => Array
            (
                [subproperty211] => "zzzzzz"
                [subproperty212] => "wwwwww"
            )
        ['subproberty22'] => "yyyy"

    )
   ...

これを行うスマートな方法が見つかりません。誰か助けてもらえますか?

だから、これまでのところ、私はこの種のアルゴリズムを考えてきました:

$new_array = array();
foreach($old_array as $key => $value)
{
    $subkeys = explode('.', $key);
    $ss = array();
    for($ii = 0 ; $ii < count($subkeys) ; $ii++)
    {
        $ss[] = "['".$subkeys[$ii]."']";
        if ($ii < count($subkeys) -1)
            eval('$new_array'.implode('',$ss).' = array();');
    }
    eval('$new_array'.implode('',$ss)." = '".$value."';');
}

たとえば、新しい配列を作成することでデータの重複を避けることができるのではないでしょうか?

4

2 に答える 2

0

いくつかのテストされていないコード。

配列をループするだけです。

function SplitArray($properties) {
    foreach($properties as $item=>$property) {
        $properties[$item] = explode('.',$property, 2);
        if(strpos($properties[$item][1], '.') === false)) {}
        else {
            $properties[$item][1] = SplitArray($properties[$item][1]);
        }
    }
    return $properties;
}
于 2013-10-20T12:08:59.100 に答える
0

私の作業例:

function nestedKeysArray($input) {
    $array = array();
    foreach ($input as $key => $value) {
        $keys = explode('.', $key);
        if (count($keys) == 1) {
            $array[$key] = $value;
        } else {
            $nested = &$array;
            foreach ($keys as $k) {
                if (!isset($nested[$k]))
                    $nested[$k] = array();
                $nested = &$nested[$k];
            }
            $nested = $value;
        }
    }
    return $array;
}

$input は、質問の最初のような配列です。

編集: コピーなしで元の配列を変更する:

function nestedKeysArray(&$input) {
    foreach ($input as $key => $value) {
        $keys = explode('.', $key);
        if (count($keys) > 1) {
            $nested = &$input;
            foreach ($keys as $k) {
                if (!isset($nested[$k]))
                    $nested[$k] = array();
                $nested = &$nested[$k];
            }
            $nested = $value;
            unset($input[$key]);
        }
    }
}
于 2013-10-20T12:47:23.587 に答える