我遇到了这个问题。我有一个看起来像这样的字符串:
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
)
)
)
)
有可能吗?
答案 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数组加载回来,请查看serialize和unserialize函数。
当然你可以从你的字符串构建一个数组,但是你必须编写一个解析器。
答案 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;
}