2011-10-19 58 views
0

编辑:感谢@Felix Kling和@mario指向我指定的捕获组和PREG_SET_ORDER,我今天完全学到了一些东西。有效转换阵列(PHP)

虽然我很好奇算法本身。所以请只假装没有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 
    ) 
    … 
) 

是的fugly:

$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]); 
    } 
} 

任何改进的建议?

+0

也许使用命名捕获组更容易... –

+0

而'PREG_SET_ORDER'可能会有所帮助。 – mario

+0

当然,如果你不想要实际的解决方案,这属于codereview.SE或codegolf.SE? (这不是一个坏问题) –

回答

1

有一种更简单的方法来产生所需的输出。

while (count($input_arr[0])) { 
    $values = array_map("array_shift", & $input_arr); 
    $result_arr[] = array_combine($field_names, $values); 
} 

这不会超过PHP 5.3,因为它需要通过引用强制传递参数。 (在这里避免任何愚蠢的语言言论)。但是你可以随时用更复杂的手动循环切断条目。

然而,这种情况的真正简化是array_combine将列表转换为关联数组。