PHP - 从字符串和值构建数组

时间:2017-07-11 07:27:59

标签: php arrays multidimensional-array explode

如何从字符串和值构建数组?

例如:

            string              |        value
                                |   
objectId                        |   19
location.street                 |   Rue des clochets
translations.fr.idTranslation   |   4

结果必须是:

[
    'objectId' => 19,
    'location' => [
        'street' => 'Rue des clochets'
    ],
    'translations' => [
        'fr' => [
            idTranslation => 4
        ],
    ]
]

很明显,如果密钥已经存在,那么它是完整的,而不是重复的。

喜欢:     translation.fr.country |法国

阵列将变为:

[
    'object' => 19,
    'location' => [
        'street' => 'Rue des clochets'
    ],
    'translations' => [
        'fr' => [
            'idTranslation' => 4,
            'country'       => 'France'
        ],
    ]
]

我认为,使用explode是一种很好的方法,但我找不到好的语法。

我方法的负责人是:

 public function buildArray($key, $value) {

 }

我在foreach中称这种方法。

数组是属性。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

public function buildArray($key, $value) {   
  $keys = explode('.', $key);

  $x = count($keys) - 1;
  $temp = array($keys[$x] => $value);
  for($i = $x-1; $i >= 0; $i--)
  {
    $temp = array($keys[$i] => $temp);
  }
  return $temp
}

这样的事情应该有效。如果没有你的一些工作它没有运行,请表示道歉,它是未经测试的,但似乎有效https://3v4l.org/3HBAY。 当然,这将为每个键/值对提供一个数组。您必须将返回的数组(array_merge_recursive)与您的foreach中的结果合并。

答案 1 :(得分:0)

下面的代码,你也可以在https://3v4l.org/sLvXp

修补它
<?php

$input = "objectId                        |   19
location.street                 |   Rue des clochets
translations.fr.idTranslation   |   4";

$output = [];

$lines = explode("\n", $input);
foreach ($lines as $line) {
    $cols = explode("|", $line);
    $key = trim($cols[0]);
    $value = trim($cols[1]);
    $indices = explode('.', $key);
    $first = array_shift($indices);
    if (!isset($output[$first]))
        $output[$first] = [];
    $target = &$output[$first];
    foreach ($indices as $index) {
        if (!isset($target[$index])) {
            $target[$index] = [];
            $target = &$target[$index];
        }
    }
    $target = $value;
}

var_dump($output);