phparraysmultidimensional-arraygroupingprefix

Group a flat array by value prefix and populate an indexed array of indexed arrays


I have an array like this:

[
    'ing_1_ing',
    'ing_1_amount',
    'ing_1_det',
    'ing_1_meas',
    'ing_2_ing',
    'ing_2_amount',
    'ing_2_det',
    'ing_2_meas',
]

And I want to group the values into an array like this:

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
    )
)

There may be many other items named like that: ing_NUMBER_type

How do I group the first array to the way I want it? I tried this, but for some reason, strpos() sometimes fails:

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

What is wrong?


Solution

  • It depends what you are trying to achieve, if you want to split array by chunks use array_chunk method and if you are trying to create multidimensional array based on number you can use sscanf method in your loop to parse values:

    $result = array();
    
    foreach ($firstArray as $value)
    {
        $n = sscanf($value, 'ing_%d_%s', $id, $string);
    
        if ($n > 1)
        {
            $result[$id][] = $value;
        }
    }