[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Иерархия url
Slays
Может задача и простая, но почему то встал в ступор, может кто подскажет )
Есть URL, например,

catalogue/car/audi/a4
catalogue/car/audi/a5

Нужно разбить их и получить иерархию, ассоциативный массив вида

[
catalogue => [
car => [
audi => [
a4,
a5
]
]
]
]


Ну и т.д.
Пробую через explode и array_shift / array_pop, но пока что-то тухло. Может лучше это сделать через рекурсию. Какое решение кто видит ?


_____________
если помог, не скупись на карму =)
Bolik
если знаешь количество уровней

$a = ['catalogue/car/audi/a4', 'catalogue/car/audi/a5'];
$result = [];
foreach ($a as $line) {
list($level1, $level2, $level3, $level4) = explode('/', $line);
$result[$level1][$level2][$level3][] = $level4;
}


ну или можешь считать сначала количествро уровней...
Slays
Спасибо, подобное решение пробовал, но количество уровней может быть разным в каждом url, а динамически расширять list мы вроде не можем. Если только составлять костыль из if else для разного количества

_____________
если помог, не скупись на карму =)
Bolik

$a = ['catalogue/car/audi/a4', 'catalogue/car/audi/a5', 'catalogue/car/bmw/a5'];
function stringToArray($path)
{
$pos = strpos($path, '/');
if ($pos === false) {
return array($path);
}
$key = substr($path, 0, $pos);
$path = substr($path, $pos + 1);
$result = array(
$key => stringToArray($path),
);

return $result;
}
$result = array_map('stringToArray', $a);
$final = [];
foreach($result as $res) {
$final = array_merge_recursive($res, $final);
}
Slays
Круто, это очень близко, но если задать разные данные, например
$a = ['catalogue/car/audi/a4', 'catalogue/car/audi/a5', 'catalogue/car', 'catalogue'];


немного ломается

_____________
если помог, не скупись на карму =)
Slays
Оттолкнулся от твоего варианта, вышло что-то такое:


$a = ['catalogue/car/audi/a4', 'catalogue/car/audi/a5', 'catalogue/car', 'catalogue'];
function stringToArray($path)
{
$path = explode('/', $path);
$key = array_shift($path);

if(count($path) > 0){
$result = array(
$key => stringToArray(implode('/',$path)),
);
return $result;
}else{
return array($key => []);
}
}
$result = array_map('stringToArray', $a);
$final = [];
foreach($result as $res) {
$final = array_merge_recursive($res, $final);
}


Иерархия адекватная:

Array
(
[catalogue] => Array
(
[car] => Array
(
[audi] => Array
(
[a5] => Array
(
)

[a4] => Array
(
)
)
)
)
)


Но у последних блоков не нравится array, хотелось бы

Array
(
[catalogue] => Array
(
[car] => Array
(
[audi] => Array
(
[0] => a4,
[1] => a5

)
)
)
)


Можно и так оставить, но визаульно не очень, особенно если больше 100 элементов

_____________
если помог, не скупись на карму =)
sergeiss
Slays, а почему именно такая задача, почему тебе не нравится массив, который ты получаешь из explode()?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Bolik
а если так?


$a = ['catalogue/car/audi/a4', 'catalogue/car/audi/a5', 'catalogue/car/bmw', 'catalogue/car', 'catalogue'];
function stringToArray($path)
{
$pos = strpos($path, '/');

if ($pos === false) {
return array($path => 0);
}
$key = substr($path, 0, $pos);
$path = substr($path, $pos + 1);
$result = array(
$key => stringToArray($path),
);

return $result;
}

function array_merge_recursive_ex(array & $array1, array & $array2) {
$merged = $array1;
foreach ($array2 as $key => & $value) {
if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) {
$merged[$key] = array_merge_recursive_ex($merged[$key], $value);
} else {
$merged[$key] = $value;
}
}

return $merged;
}

$result = array_map('stringToArray', $a);
$final = [];
foreach($result as $res) {
$final = array_merge_recursive_ex($res, $final);
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.