如何将带括号的字符串转换为php中的数组

时间:2014-08-13 13:13:36

标签: php arrays string

我遇到了这个问题。我有一个看起来像这样的字符串:

coilovers[strut_and_individual_components][complete_strut][][achse]

我想将它转换为看起来像这样的数组:

[coilovers] => Array
(
    [strut_and_individual_components] => Array
    (
        [complete_strut]=> Array
        (
            [1] => Array
            (
                [achse] => some_value     
            )
            [2] => Array
            (
                [achse] => some_value     
            )
        )
    )
)

有可能吗?

4 个答案:

答案 0 :(得分:1)

以下是将尝试解析此字符串的解析器的快速实现:

$input = 'coilovers[strut_and_individual_components][complete_strut][][achse]'; 

$output = array(); 
$pointer = &$output;

while( ($index = strpos( $input, '[')) !== false) {  
    if( $index != 0)  { 
        $key = substr( $input, 0, $index);
        $pointer[$key] = array();
        $pointer = &$pointer[$key];
        $input = substr( $input, $index);
        continue;
    }
    $end_index = strpos( $input, ']'); 
    $array_key = substr( $input, $index + 1, $end_index - 1);
    $pointer[$array_key] = array();
    $pointer = &$pointer[$array_key];
    $input = substr( $input, $end_index + 1);
}

print_r( $output);

基本上,我们正在迭代字符串以查找匹配的[]标记。当我们这样做时,我们将括号内的值作为$array_key并将其添加到$output数组中。我通过引用使用指向原始$pointer数组的另一个变量$output,但随着迭代的进行,$pointer指向添加到$output的最后一个元素。

它产生:

Array
(
    [coilovers] => Array
        (
            [strut_and_individual_components] => Array
                (
                    [complete_strut] => Array
                        (
                            [] => Array
                                (
                                    [achse] => Array
                                        (
                                        )

                                )

                        )

                )

        )

)

请注意,我已经离开了[](一个空数组键)的实现,并将最后一个索引(some_value)中的值设置为用户的练习。

答案 1 :(得分:1)

我已经找到了另一个答案,它看起来像这样:

private function format_form_data(array $form_values) {

    $reformat_array = array();
    $matches = array();
    $result = null;

    foreach($form_values as $value) {
        preg_match_all("/\[(.*?)\]/", $value["name"], $matches);
        $parsed_product_array = $this->parse_array($matches[1], $value["value"]);
        $result = array_push($reformat_array, $parsed_product_array);
    }

    return $result;
}

private function parse_array(array $values, $value) {
    $reformat = array();
    $value_carrier_key = end($values);

    foreach (array_reverse($values) as $arr) {
        $set_value_carrier = array($arr => $reformat);
        if($arr == $value_carrier_key) {
            $set_value_carrier = array($arr => $value);
        }
        $reformat = empty($arr) ? array($reformat) : $set_value_carrier;
    }

    return $reformat; 
}

其中数组$ form_values是:

Array
(
   [name] => '[coilovers][strut_and_individual_components][complete_strut][][achse]',
   [value] => 'some_value'
)

答案 2 :(得分:0)

没有。如果您evaluate字符串,您将获得无效的PHP。

如果要将PHP数组存储为字符串并将其作为PHP数组加载回来,请查看serializeunserialize函数。

当然你可以从你的字符串构建一个数组,但是你必须编写一个解析器。

答案 3 :(得分:0)

我建议的解决方案:

function format_form_data(array $data) {

    $matches = array();
    $result = [];

    foreach($data as $key => $value) {
        preg_match_all("/\[(.*?)\]/", $key, $matches);
        $matches = array_reverse($matches[1]);
        $matches[] =  substr( $key, 0, strpos($key, '['));;

        foreach ($matches as $match) {
            $value = [$match=>$value];
        }

        $result = array_replace_recursive($result, $value);
    }

    return $result;
}