Разбить массив, создание вложенных массивов по уникальной части значения ключа [PHP]

Есть массив.

Там есть подмассив.

Значения типа 1 - 1111-мамба
2 - 1111-карамба
3 - 2222
4 - 2222-харамба

Надо как-то разбить, по этим уникальным первым цифрам. Т.е до тире, или цифра до ничего.

Что нужно в результате,


типа 1111 - внутри 1111-мамба
2222-карамба

2222 - внутри 2222
2222 - карамба

Значения 1111 - мамба , карамба , в тм же порядке что и в ориг. массиве

Вот так примерно

Помогите, что-то запутался...
+ результат должен обязательно идти по порядку как и значения шли.

1 ответов



$sort_this = array(
    1 => "1111-мамба",
    2 => "1111-карамба",
    3 => "2222",
    4 => "2222-харамба",
    5 => "3333",
    6 => "4444-трям"
);

// Составляем массив ключей для нашего дерева
// Шаблон: 4 подряд идущих цифры
// функцией preg_filter мы выбираем все элементы, подходящие под шаблон,
// при этом из них отсеивается всё, кроме первых 4 цифр
// функцией array_unique мы отсеиваем возможные повторы
$keys = array_unique(preg_filter("@(?<=^\d{4}).*$@", "", $sort_this));

// Далее мы разбиваем входной массив на части,
// взяв в качестве шаблона найденные ранее ключи
foreach ($keys as $key) {
    $sorted_tree[$key] = preg_grep("@^{$key}-@", $sort_this);
}
unset($key, $keys);
var_dump($sorted_tree);
/*
 * Выведет:
 * array (size=3)
 * 1111 =>
 *   array (size=2)
 *   1 => string '1111-мамба' (length=15)
 *   2 => string '1111-карамба' (length=19)
 * 2222 =>
 *   array (size=1)
 *   4 => string '2222-харамба' (length=19)
 * 3333 =>
 *  array (size=0)
 *    empty
 * 4444 =>
 *   array (size=1)
 *   6 => string '4444-трям' (length=13)
 */

 

У меня массив вида


 [0] => Array
        (
            [0] => 480-1
            [1] => 480-2
            [2] => 480-3
            [3] => 480-4
            [4] => 491-1
            [5] => 491-2
            [6] => 492-1
            [7] => 492-2
            [8] => 492-3
            [9] => 492-4
        )
 

В отношении него не работает, показывает

NULL
 

Без разницы как прописать


$keys = array_unique(preg_filter("@(?<=^\d{4}).*$@", "", $inv_nomer[0]));
 

или


$keys = array_unique(preg_filter("@(?<=^\d{4}).*$@", "", $inv_nomer));
 


В чем может быть проблема?


function formatArray($array) {
    $result = array();

    foreach ($array as $k=>$v) {
        if(strpos($v, '-') === false) continue;

        $index = strstr($v, '-', true);
        $result[$index][$k] = $v;
    }

    return $result;
}
 


$_a = array(
    0 => '480-1',
    1 => '480-2',
    2 => '480-3',
    3 => '480-4',
    4 => '491-1',
    5 => '491-2',
    6 => '492-1',
    7 => '492-2',
    8 => '492-3',
    9 => '492-4',
);
print_r(formatArray($_a));

Array
(
    [480] => Array
        (
            [0] => 480-1
            [1] => 480-2
            [2] => 480-3
            [3] => 480-4
        )

    [491] => Array
        (
            [4] => 491-1
            [5] => 491-2
        )

    [492] => Array
        (
            [6] => 492-1
            [7] => 492-2
            [8] => 492-3
            [9] => 492-4
        )

)