Intereting Posts

Массив группы 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++; } } 

Что не так? Можете ли вы советовать?

Это зависит от того, чего вы пытаетесь достичь, если вы хотите разделить массив кусками с помощью метода array_chunk и если вы пытаетесь создать многомерный массив на основе числа, вы можете использовать метод sscanf в своем цикле для анализа значений:

 $result = array(); foreach ($firstArray as $value) { $n = sscanf($value, 'ing_%d_%s', $id, $string); if ($n > 1) { $result[$id][] = $value; } } 
 <?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 ) ) 

Я бы сделал что-то вроде этого:

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

В основном вы повторяете свой первый массив, видите, какой номер есть, и поместите его в нужное место в вашем конечном массиве.

ИЗМЕНИТЬ . Если вы знаете, что числа всегда начинаются с 1 , вы можете заменить $number = $matches[1]; для $number = $matches[1] - 1; , таким образом вы получите точно такой же результат, который вы указали в качестве примера.