Взяв строку свойств, разделенных точкой, и преобразовав ее в объект json в php - PullRequest
0 голосов
/ 23 июня 2011

Я вполне уверен, что упускаю что-то ослепительно очевидное здесь, но здесь это идет.

Я работаю над обновлением функции поиска в приложении, которое выполняло цикл, и выполняю очень большое количество SQL-запросов, чтобы получить отношения объект / таблица к одному большому запросу, который возвращает все. Однако единственный способ, которым я мог подумать о том, чтобы вернуть отношения, - это разделить точкой, и сейчас я хочу взять плоский массив ключей и значений и преобразовать его в ассоциативный массив, который затем будет jsonified с помощью json_encode.

Например, что у меня есть это ...

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

Теперь я уверен, что это должен быть довольно простой рекурсивный цикл, но для меня сегодня утром я не могу понять это.

Любая помощь очень ценится.

Привет

Graham.

Ответы [ 3 ]

2 голосов
/ 25 июня 2011

Ваша функция была частично там, Майк, хотя у нее была проблема с тем, что значение верхнего уровня продолжало сбрасываться при каждом проходе массива, поэтому только свойство, разделенное последним периодом, сделало это.

Пожалуйста, смотрите обновленную версию.

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;
}
0 голосов
/ 23 июня 2011
$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
                                )

                        )

                )

        )

)
0 голосов
/ 23 июня 2011

Я уверен, что есть что-то более элегантное, но быстрое и грязное:

$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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...