繁体   English   中英

数组操作(PHP)

[英]Array manipulation (PHP)

我有一个像这样的数组:

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."';');
}

我认为我们可以做得更好,例如,也许可以避免通过创建新数组来重复数据?

一些未经测试的代码,为您提供指导。

只需遍历数组即可;

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;
}

我的工作示例:

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]);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM