Алгоритмы заполнения многомерного массива

niko42

Новичок
Доброго времени суток.

Была задача:
Из этого:
PHP:
$arr = array(
    'cars/ddd',
    'cars/ddd/*',
    'cars/ddd/asf',
    'cars/sss',
    'moto'
);
Получить это:
PHP:
Array
(
    [cars] => Array
        (
            [ddd] => Array
                (
                    [*] => Array
                        (
                        )

                    [asf] => Array
                        (
                        )

                )

            [sss] => Array
                (
                )

        )

    [moto] => Array
        (
        )

)
Вопрос на сколько будет оправдан данный алгоритм при роутинге:
PHP:
$args = array();

for($i = 0, $count = count($arr); $i < $count; $i++) {

    $tmp = array_reverse(explode('/', $arr[$i]));
    $temp = array();

    for($t = 0, $countTmp = count($tmp); $t < $countTmp; $t++){
        unset($r);
        $r[$tmp[$t]] = $temp;
        $temp = $r;
    }

    $args = array_merge_recursive($args, $temp);

}

print_r($args);
P.S. далее на основание полученного массива бежим по дереву и вызываем нужный код (входная строка будет url). Т.е. у каждого пути свой метод вызова Router::get('car/af', function(){echo 'труляля'})
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
niko42, если я не ошибаюсь - кеш регулярок хранится в shared-memory fcgi, так что все достаточно быстро. Этот результат можно переплюнуть только на сях, явно не из php)
 

hell0w0rd

Продвинутый новичок
каждый дрочит как он хочет) Я вот все утро Doctrine\Instantiator на сях пытаюсь написать, тоже весело)
 

Redjik

Джедай-мастер
каждый дрочит как он хочет) Я вот все утро Doctrine\Instantiator на сях пытаюсь написать, тоже весело)
узкое место чтоли?
на сях с плюсиками или так - по хардкору? =)

я вот все утро на сях пытаюсь длину кратчайшего пути до любой точки ориентированного взвешанного графа написать =))))
 

niko42

Новичок
Си г.... - java рулит :D
Это я к тому, что ни разу не писал на Си и даже не знаю его синтаксиса.
 

hell0w0rd

Продвинутый новичок
Redjik, ну по идее быстрее... только они как обычно абстрактную либу пишут и тесты там веселые)
Фактически я переписал метод newWithoutArgs из рефлексии только в один метод, без создания экземпляра ReflectionClass
Ну и да, на чистых сях)
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
У меня только один вопрос, нахрена тут многомерный массив? Изобретать роутеры во временя кучи готовых - можно разве, что в академических целях.
 

Redjik

Джедай-мастер
Си г.... - java рулит :D
Это я к тому, что ни разу не писал на Си и даже не знаю его синтаксиса.
тут нечем гордиться =)

Redjik, ну по идее быстрее... только они как обычно абстрактную либу пишут и тесты там веселые)
Фактически я переписал метод newWithoutArgs из рефлексии только в один метод, без создания экземпляра ReflectionClass
Ну и да, на чистых сях)
покажешь потом?
 

niko42

Новичок
c0dex, "куча готовые роутеры" - работают на регулярных выражениях, что не есть быстро.
 

hell0w0rd

Продвинутый новичок
niko42, да кто тебе это сказал?)) прочитай пост nikic о том, как он писал и тестил свой роутер. Регулярка после разбора работает ровно также как ты бы описал в своих массивах. Разобранная регулярка кешируется - работает быстро.

Ну и если реально у тебя приложение по производительности уперлось в роутинг - прикрути кешировние к роутам с редиской/мемкешем.
 

niko42

Новичок
hell0w0rd,
Router::add('/car/infity/black/fx45','hendler0');
Router::add('/car/{marka}/{color}/{model}','hendler1');
При вызове: /car/infity/black/fx45 - мы попадем в нужный результат.
А если нарушится очередность вызовов, то что - он будет бегать по всей коллекции и искать нужный результат?
 
Последнее редактирование:

antson

Новичок
Партнер клуба
niko42, Вы уверены, что роутинг это самое узкое место ? Если уж речь пошла про доли миллисекунд, то может нужно думать о других способах ускориться.
Например вынести роутинг на уровень nginx ?
Его можно научить вынимать готовую страницу из мемкеша.
 

niko42

Новичок
antson, можно вообще тупо сгенерировать html и nginx`ом отдавать и не тупить. Но это всё хранение а не вычислительная система.

+ ко всему, у меня одно ядро на все сайты, где сайты могут общаться между собой, где общая библиотека для всех (если что в библиотке надо изменить тупо overriding в определенном сайте), но конфигурация php, фастсги, nginx разная
Т.е. архитектура следующая.
appSite1
appSite2
и т.д.
lib
core
Site1(www)
Site2(www)
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
И достаточно лажануть в одном месте, чтобы все накрылось медным тазом.

hell0w0rd,
Router::add('/car/infity/black/fx45','hendler0');
Router::add('/car/{marka}/{color}/{model}','hendler1');
При вызове: /car/infity/black/fx45 - мы попадем в нужный результат.
А если нарушится очередность вызовов, то что - он будет бегать по всей коллекции и искать нужный результат?
Какая еще очередность вызовов? Какой результат в коллекции?
 

antson

Новичок
Партнер клуба
Не пойму, реальный смысл такой оптимизации .
Не большой но очень гибкий сайт, где каждой странице можно назначить индивидуальные параметры обработчика
Кладем в муську табличку (полный урл, контролер)

Высоко нагруженный с большим числом материалов , но однотипными данными
фиксируем структуру урла
/класс/метод/аргументы
 
Сверху