Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取一个由句点分隔的属性组成的字符串,并在php中将其转换为json对象_Php_String_Arraylist - Fatal编程技术网

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

获取一个由句点分隔的属性组成的字符串,并在php中将其转换为json对象,php,string,arraylist,Php,String,Arraylist,我相当肯定我在这里遗漏了一些显而易见的东西,但事情就是这样 我正在一个运行循环的应用程序中更新一个搜索函数,并执行大量sql查询,以获取一个返回所有内容的大型查询的对象/表关系。然而,我认为返回关系的唯一方法是周期分隔的,我现在想要做的是将键和值的平面数组转换成一个关联数组,然后用json_encode进行jsonified 例如,我所拥有的是 array( "ID"=>10, "CompanyName"=>"Some Company", "Compan

我相当肯定我在这里遗漏了一些显而易见的东西,但事情就是这样

我正在一个运行循环的应用程序中更新一个搜索函数,并执行大量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"
     )
);
我想把它变成这个

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"
     )
);
现在我确信这应该是一个相当简单的递归循环,但就我今早的生活而言,我无法理解它

非常感谢您的帮助

问候


格雷厄姆。

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

$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;
}
产出:

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
                                )

                        )

                )

        )

)

您的函数在某种程度上是这样的,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;
}

虽然我认为我需要一些更具动态性的东西,例如一个关系可以达到五个层次的深度,我想可能会有一个计算部分的开关,尽管如果最大深度发生变化,它总是需要更新。使用指针不是解决方案。非常感谢你,迈克。