获取一个以句点分隔的属性字符串,并将其转换为php中的json对象


Taking a string of period separated properties and converting it to a json object in php

我很确定我在这里错过了一些显而易见的东西,但它开始了。

我正在更新一个应用程序中的搜索函数,该应用程序正在运行一个循环,并进行大量的sql查询,以获取对象/表与一个返回所有内容的大型查询的关系。然而,我认为返回关系的唯一方法是以句点分隔,我现在想做的是获取键和值的平面数组,并将其转换为关联数组,然后用json_encode进行json化。

例如,我有这个。。。

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"
     )
);

现在我确信这应该是一个相当简单的递归循环,但就我今天早上的生活而言,我无法理解它。

非常感谢您的帮助。

问候

格雷厄姆。

您的函数是mike的一部分,尽管它存在的问题是,在数组的每次传递中,顶级值都会不断重置,因此只有最后一个句点分隔的属性才能进入。

请参阅更新版本。

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

我相信还有更优雅但又快又脏的东西:

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