从INI字符串生成数组

时间:2018-02-16 03:43:29

标签: php arrays string ini

$variable = '
    persons.0.name = "peter"
    persons.0.lastname = "griffin"
    persons.1.name = "homer"
    persons.1.lastname = "simpsons"';

我想从那个$变量生成一个看起来像这个

的数组
array(2) {
  [0]=>
  array(2) {
    ["name"]=>
    string(5) "peter"
    ["lastname"]=>
    string(7) "griffin"
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(5) "homer"
    ["lastname"]=>
    string(7) "simpson"
  }
} 
到目前为止,这是我到目前为止所做的。

$temp = explode('\r\n', $persons);

$sets = [];
foreach ($temp as $value)
{
    $array = explode('=', $value);

    if ($array[0] != '')
    {
        $array[1] = trim($array[1], '"');
        $sets[$array[0]] = $array[1];
        $output = $sets;
    }
}

生成“persons.1.name”作为键,“peter”作为值 我不知道如何基于“。”生成数组。谢谢。

我尝试使用parse_ini_string(),但基本上是做同样的事情。

3 个答案:

答案 0 :(得分:2)

您可以使用array_reduceexplode

$variable = '
    persons.0.name = "peter"
    persons.0.lastname = "griffin"
    persons.1.name = "homer"
    persons.1.lastname = "simpsons"';

$temp = explode(PHP_EOL, $variable);

$result = array_reduce($temp, function($c, $v){
    $v = explode( "=", $v );
    if ( trim( $v[0] ) !== "" ) {
        $k = explode( ".", $v[0]  );
        $c[ $k[ 1 ] ][ $k[ 2 ] ] = $v[1];       
    }
    return $c;
}, array());

echo "<pre>";
print_r( $result );
echo "</pre>";

这将导致:

Array
(
    [0] => Array
        (
            [name ] =>  "peter"
            [lastname ] =>  "griffin"
        )

    [1] => Array
        (
            [name ] =>  "homer"
            [lastname ] =>  "simpsons"
        )

)

Doc:http://php.net/manual/en/function.array-reduce.php

更新:如果您想设置深度,可以

$variable = '
persons.0.name = "peter"
persons.0.lastname = "griffin"
persons.1.name = "homer"
persons.1.lastname = "simpsons"
data = "foo"
url = so.com?var=true
';

$temp = explode(PHP_EOL, $variable);

$result = array_reduce($temp, function($c, $v){
    $v = explode( "=", $v, 2 );

    if ( trim( $v[0] ) !== "" ) {
        $k = explode( ".", $v[0]  );
        $data = $v[1];
        foreach (array_reverse($k) as $key) {
            $data = array( trim( $key ) => $data);
        }

        $c = array_replace_recursive( $c, $data );
    }

    return $c;
}, array());

echo "<pre>";
print_r( $result );
echo "</pre>";

这将导致:

Array
(
    [persons] => Array
        (
            [0] => Array
                (
                    [name] =>  "peter"
                    [lastname] =>  "griffin"
                )

            [1] => Array
                (
                    [name] =>  "homer"
                    [lastname] =>  "simpsons"
                )

        )

    [data] =>  "foo"
    [url] =>  so.com?var=true
)

答案 1 :(得分:0)

PHP的 ini 解析是有限的,即使它是persons[0][name] = "peter"也无法解析。

从我的回答How to write getter/setter to access multi-level array by key names?开始,首先只需explode =以获取关键路径和值,然后在.上展开密钥并构建阵列:

$lines = explode("\n", $variable);  //get lines

list($path, $value) = explode('=', $lines); //get . delimited path to build keys and value
$path = explode('.', $path); //explode path to get individual key names

$array = array();
$temp  = &$array;

foreach($path as $key) {
    $temp =& $temp[trim($key)];
}
$temp = trim($value, '"');

trim个空格和"

答案 2 :(得分:0)

因为每一行都包含数组的完整地址和数据,所以我们可以使用循环而不是递归来创建所有内容。

// Create variable for final result
$output=[];

// Loop over input lines, and let PHP figure out the key/val
foreach (parse_ini_string($variable) AS $key=>$val) {
    $stack = explode('.', $key);
    $pos = &$output;

    // Loop through elements of key, create when necessary
    foreach ($stack AS $elem) {
        if (!isset($pos[$elem]))
            $pos[$elem] = [];
        $pos = &$pos[$elem];
    }

    // Whole key stack created, drop in value
    $pos = $val;
}

// The final output
var_dump($output);

输出:

array(1) {
  ["persons"]=>
  array(2) {
    [0]=>
    array(2) {
      ["name"]=>
      string(5) "peter"
      ["lastname"]=>
      string(7) "griffin"
    }
    [1]=>
    array(2) {
      ["name"]=>
      string(5) "homer"
      ["lastname"]=>
      &string(8) "simpsons"
    }
  }
}