取一串句点分隔的属性并将其转换为php中的json对象

时间:2011-06-23 09:51:55

标签: php string arraylist

我很确定我错过了一些令人目眩的明显的事情,但现在就这样了。

我正在努力更新运行循环的应用程序中的搜索功能,并执行大量的SQL查询以获取对象/表关系到一个返回所有内容的大型查询。然而,我可以想到返回关系的唯一方法是周期分离,我现在想要做的是获取平面数组的键和值,并将其转换为关联数组,然后用json_encode进行jsonified。

例如我所拥有的是......

array(
     "ID"=>10,
     "CompanyName"=>"Some Company",
     "CompanyStatusID"=>2,
     "CompanyStatus.Status"=>"Active",
     "addressID"=>134,
     "address.postcode"=>"XXX XXXX",
     "address.street"=>"Some Street"
);

我想把它变成这个......

array(
     "ID"=>10,
     "CompanyName"=>"Some Company",
     "CompanyStatusID"=>2,
     "CompanyStatus"=>array(
          "Status"=>"Active"
     ),
     "addressID"=>134,
     "address"=>array(
          "postcode"=>"XXX XXXX",
          "street"=>"Some Street"
     )
);

现在我确定这应该是一个相当简单的递归循环,但对于我今天早上的生活,我无法弄明白。

非常感谢任何帮助。

此致

格雷厄姆。

3 个答案:

答案 0 :(得分:2)

你的函数是迈克的一部分,虽然它的问题是顶级值在数组的每次传递中都会被重置,所以只有最后一个句点分隔的属性才能进入。

请参阅更新版本。

function parse_array($src) {
    $dst = array();
    foreach($src as $key => $val) {
        $parts = explode(".", $key);
        if(count($parts) > 1) {
            $index = &$dst;
            $i = 0;
            $count = count($parts)-1;
            foreach(array_slice($parts,0) as $part) {
                if($i == $count) {
                    $index[$part] = $val;
                } else {
                    if(!isset($index[$part])){
                        $index[$part] = array();
                    }
                }
                $index = &$index[$part];
                $i++;
            }
        } else {
            $dst[$parts[0]] = $val;
        }
    }
    return $dst;
}

答案 1 :(得分:0)

我确信有更优雅,但又快又脏的东西:

$arr = array(
     "ID"=>10,
     "CompanyName"=>"Some Company",
     "CompanyStatusID"=>2,
     "CompanyStatus.Status"=>"Active",
     "addressID"=>134,
     "address.postcode"=>"XXX XXXX",
     "address.street"=>"Some Street"
);
$narr = array();
foreach($arr as $key=>$val)
{
    if (preg_match("~\.~", $key))
    {
        $parts = split("\.", $key);
        $narr [$parts[0]][$parts[1]] = $val;
    }
    else    $narr [$key] = $val;
}

答案 2 :(得分:0)

$arr = array(
     "ID" => 10,
     "CompanyName" => "Some Company",
     "CompanyStatusID" => 2,
     "CompanyStatus.Status" => "Active",
     "addressID" => 134,
     "address.postcode" => "XXX XXXX",
     "address.street" => "Some Street",
     "1.2.3.4.5" => "Some nested value"
);

function parse_array ($src) {
    $dst = array();

    foreach($src as $key => $val) {

        $parts = explode(".", $key);

        $dst[$parts[0]] = $val;

        if(count($parts) > 1) {
            $index = &$dst[$parts[0]];
            foreach(array_slice($parts, 1) as $part) {
                $index = array($part => $val);
                $index = &$index[$part];
            }
        }
    }

    return $dst;
}

print_r(parse_array($arr));

输出:

Array
(
    [ID] => 10
    [CompanyName] => Some Company
    [CompanyStatusID] => 2
    [CompanyStatus] => Array
        (
            [Status] => Active
        )

    [addressID] => 134
    [address] => Array
        (
            [street] => Some Street
        )

    [1] => Array
        (
            [2] => Array
                (
                    [3] => Array
                        (
                            [4] => Array
                                (
                                    [5] => Some nested value
                                )

                        )

                )

        )

)