2012-01-19 6 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

이 같은 것입니다.

편집. 숫자가 항상 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 
     ) 

)