PHP Group массив по значениям - PullRequest
0 голосов
/ 19 января 2012

У меня есть такой массив:

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

Что не так? Вы можете посоветовать?

Ответы [ 3 ]

4 голосов
/ 19 января 2012

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

$result = array();

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

    if ($n > 1)
    {
        $result[$id][] = $value;
    }
}
1 голос
/ 19 января 2012
<?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
        )

)
0 голосов
/ 19 января 2012

То, что я бы сделал, выглядит примерно так:

$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;, таким образом, вы получите точно такой же результат, который вы опубликовали в качестве примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...