2011-10-19 89 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將列表轉換爲關聯數組。