簡體   English   中英

取一串句點分隔的屬性並將其轉換為php中的json對象

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

我很確定我錯過了一些令人目眩的明顯的東西,但現在就去了。

我正在努力更新一個運行循環的應用程序中的搜索功能,並執行大量的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"
     )
);

現在我確定這應該是一個相當簡單的遞歸循環,但對於我今天早上的生活,我無法弄明白。

任何幫助是極大的贊賞。

問候

格雷厄姆。

你的函數是邁克的一部分,雖然它有一個問題,即頂級值在數組的每次傳遞中都會被重置,所以只有最后一個句點分隔的屬性才能進入。

請參閱更新版本。

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
                                )

                        )

                )

        )

)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM