Разбить массив, создание вложенных массивов по уникальной части значения ключа [PHP]
Есть массив.
Там есть подмассив.
Значения типа 1 - 1111-мамба
2 - 1111-карамба
3 - 2222
4 - 2222-харамба
Надо как-то разбить, по этим уникальным первым цифрам. Т.е до тире, или цифра до ничего.
Что нужно в результате,
типа 1111 - внутри 1111-мамба
2222-карамба
2222 - внутри 2222
2222 - карамба
Значения 1111 - мамба , карамба , в тм же порядке что и в ориг. массиве
Вот так примерно
Помогите, что-то запутался...
+ результат должен обязательно идти по порядку как и значения шли.
Там есть подмассив.
Значения типа 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
Без разницы как прописать
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
)
)