2012-01-19 13 views
0

私はこのような配列があります。PHPグループ配列は

Array ( 
    [0] => ing_1_ing 
    [1] => ing_1_amount 
    [2] => ing_1_det 
    [3] => ing_1_meas 
    [4] => ing_2_ing 
    [5] => ing_2_amount 
    [6] => ing_2_det 
    [7] => ing_2_meas 
) 

を私は値このようなアレイにグループ化する:

Array (
    [0] => Array(
      [0] => ing_1_ing 
      [1] => ing_1_amount 
      [2] => ing_1_det 
      [3] => ing_1_meas 
     ) 
    [1] => Array(
      [0] => ing_2_ing 
      [1] => ing_2_amount 
      [2] => ing_2_det 
      [3] => ing_2_meas 
     ) 
) 

のような名前の他の多くの項目があるかもしれませんそれ:ing_NUMBER_type

私はそれをどのようにしてグループ化したいのですか?私はこれを試してみましたが、何らかの理由で、strpos()は時々失敗:

$i = 1;  
foreach ($firstArray as $t) { 
      if (strpos($t, (string)$i)) { 
       $secondArray[--$i][] = $t; 
      } else { 
       $i++; 
      } 
     } 

何が悪いのでしょうか?アドバイスできますか?

$result = array(); 
foreach ($firstArray as $value) 
{ 
    preg_match('/^ing_(\d+)_/', $value, $matches); 
    $number = $matches[1]; 
    if (!array_key_exists($number, $result)) 
    $result[$number] = array(); 
    $result[$number][] = $value; 
} 

基本的にはあなたが最初の配列を反復処理、そこにあるものの数を参照し、最終的な配列内の適切な場所にそれを置く:私は思い何

答えて

4

それはあなたの数に基づいて多次元配列を作成しようとしている場合、あなたはチャンクで配列がarray_chunkメソッドを使い分割したい場合は、達成しようとしているかによって異なりますループ内でsscanfメソッドを使用して値を解析することができます:

$result = array(); 

foreach ($firstArray as $value) 
{ 
    $n = sscanf($value, 'ing_%d_%s', $id, $string); 

    if ($n > 1) 
    { 
     $result[$id][] = $value; 
    } 
} 
+0

簡単に素晴らしい! – Pateman

0

はこのようなものです。

EDIT。数字が常に1から始まることがわかっている場合は、$number = $matches[1];$number = $matches[1] - 1;に置き換えることができます。この方法で、あなたの例と同じ結果を得ることができます。

1
<?php 
$ary1 = array("ing_1_ing","ing_1_amount","ing_1_det","ing_1_meas","ing_2_ing","ing_2_amount","ing_2_det","ing_2_meas"); 
foreach($ary1 as $val) 
{ 
    $parts = explode("_",$val); 
    $ary2[$parts[1]][]=$val; 
} 
?> 

これが作成されます。

Array 
(
    [1] => Array 
     (
      [0] => ing_1_ing 
      [1] => ing_1_amount 
      [2] => ing_1_det 
      [3] => ing_1_meas 
     ) 

    [2] => Array 
     (
      [0] => ing_2_ing 
      [1] => ing_2_amount 
      [2] => ing_2_det 
      [3] => ing_2_meas 
     ) 

)