2011-10-19 10 views
0

編集: @ 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]); 
    } 
} 

改善のための任意の提案ですか?

+0

名前付きキャプチャグループを使用する方が簡単かもしれません... –

+0

そして、 'PREG_SET_ORDER'が役立つかもしれません。 – mario

+0

確かに、実際のソリューションが必要ない場合、これはcodereview.SEまたはcodegolf.SEに属していますか? (それは悪い質問ではない) –

答えて

1

目的の出力を生成する簡単な方法が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です。

関連する問題