编辑:感谢@Felix Kling和@mario为我指出了命名捕获组和PREG_SET_ORDER
,我今天完全学到了一些东西。
我对更好的算法本身很好奇。所以请假装没有涉及preg_match()
。
编辑2:抽象问题
在回答这里的另一个问题时,我偶然发现我的转
的代码:
Array
(
[0] => Array (
[0] => 1
[1] => 3
)
[1] => Array (
[0] => Description text
[1] => Different Description text
)
[2] => Array (
[0] => 123.456.12
[1] => 234.567.89
)
[3] => Array (
[0] => 10.00
[1] => 10.00
)
[4] => Array (
[0] => 10.00
[1] => 30.00
)
)
到:
Array
(
[0] => Array
(
[qty] => 1
[description] => "Description text"
[sku] => 123.456.12
[price] => 10.00
[total] => 10.00
)
…
)
是丑毙:
$field_names = array('qty', 'description', 'sku', 'price', 'total');
$result_arr = array();
$num_iter = count(matches[0]);
for ($i = 0; $i < $num_iter; $i++) {
foreach ($field_names as $index => $field_name) {
$result_arr[$i][$field_name] = array_shift($input_arr[$index]);
}
}
有改进的建议吗?
有一种更简单的方法可以产生所需的输出。
while (count($input_arr[0])) {
$values = array_map("array_shift", & $input_arr);
$result_arr[] = array_combine($field_names, $values);
}
在PHP 5.3之后就不能工作了,因为它需要通过引用强制传递参数。(此处避免任何贬低语言的言论)。但是你当然可以在任何时候用一个更精细的手工循环来砍掉这些条目。
对于这种情况,真正的简化是array_combine
将列表转换为关联数组。