Разобрать URL-адрес неопределенной длины

Итак, я ищу способ преобразовать строку в переменную... Мне нужно получить данные из массива $Map В качестве ключа я использую $URL, который получает данные из реального URL и отделяет их... $URL = взорвать("/",$URL); Поэтому, когда я получаю доступ к значениям $Map, это нужно писать так:

$Map[$URL[0]][$URL[1]][$URL[2]][$URL[3]][$URL[4]][$URL[5]]

Поэтому я решил создать функцию, которая генерирует количество [$URL[0]] вроде

function GenerateURl($i){for ($x = 0; $x <= $i; $x++){
        $URls.='$URL['.$x.']';    
        }
        return($URls);}

Почему? У меня есть карта страниц, которые могут принимать посещения, вот что содержит $MAP, у каждого измерения есть настройки стиля и содержимого, но я действительно не хочу вводить каждое отдельное измерение вручную + его больно поддерживать его...

if ($Map[$URL[0]){ #Check if first dimension exist (Index.php/example)
   if....... #this take much more steps to verify if there is request for child, and if child exist, ofc there is else method that redirect to closest parent page
   $Style = "style_for_page.css";
   $Contend = "style_for_page.css";
}
else{
header("Location: https://example.com");
}

Я не знаю, что я делаю неправильно... Но когда я вызываю свою функцию GenerateURl(5) вывод - это строка... не работает переменная... так что это похоже на

$URL[0]$URL[1]$URL[2]$URL[3]$URL[4]

и не нравится

Пример конфиденциальности настроек пользователя профиля...... (example.com/Profile/User/Settings/Privacy/Examle)

Обновлять: Чтобы упростить мой вопрос... Мне нужно это:

$MAP = array(........) ;
$URL = array("example");
$var = "[$URl[0]]"; #$URL need to be transferred as text to print part
Print($Map[$var]);

что такое var?

Martin 30.09.2022 18:48

возможно, вы хотите взорвать строку URL и разделить ее на /; $array = explode('/',$_SERVER['REQUEST_URI']);

Martin 30.09.2022 18:52

понятия не имею, что вы подразумеваете под «рабочим варом». Вы про массив, наверное?

ADyson 30.09.2022 18:55

, P.S. Было бы очень полезно, если бы вы привели пример строки, которую вы пытаетесь проанализировать, и точный результат, который вы хотите получить в конце - боюсь, ваш пример вывода в настоящее время не имеет особого смысла.

ADyson 30.09.2022 18:56
when I call my function GenerateURl(5) output is string... ну да, .= добавляет строку к другой строке, так что этого и следовало ожидать. Вы действительно пытаетесь разделить строку URL на разные индексы массива? Если это так, взрыв, вероятно, поможет, как упоминалось выше.
ADyson 30.09.2022 18:58

Просто мне нужно поместить [$URL[0]][$URL[1]] за $Map... Для этого: $Map[$URL[0]][$URL[1]]... Сумма " [$URL[1.....99999]]" является динамическим

Jimmy Lukášík 30.09.2022 19:36

Дайте нам реальный пример $URL, который мы могли бы использовать для создания демо.

ADyson 30.09.2022 19:53

$URL из браузера, он зависит от адреса, например: если URL-адрес www.example.com/profile/setting/test/idknow, то $URL=("profile", "settings", "test", "idknow")

Jimmy Lukášík 30.09.2022 20:04

Хорошо. Итак, как вы ожидаете, что результат Print($Map[$var]); будет в конце в этом примере?

ADyson 30.09.2022 20:07

Итак, если адрес: www.example.com/profile, тогда мне нужен код: Print($Map[$URL[0]] ), который в этом примере совпадает с Print($Map["profile"] ). .... Если адрес www.example.com/profil/setting. Затем мне нужно Print($Map[$URL[0]][$URL[1]])... Я бы описал это как... Распечатать столько [$URL[0]], сколько я хочу... Число должно увеличиться на 1..... $Map[$URL[0]][$URL[1]][$URL[2]] количество "URL" является динамическим... Иногда мне нужно напечатать 1 иногда 10 ... Вывод очень сложный... Я проверяю, существует ли ($Map[$URL[0]])... Проверяю, содержит ли он более 3 дочерних элементов... Карта представляет собой 1...10-мерный массив

Jimmy Lukášík 30.09.2022 20:39

Давайте продолжим обсуждение в чате.

Jimmy Lukášík 30.09.2022 23:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
11
104
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете сделать это именно так, как вы себе представляете — PHP не может сгенерировать исполняемый набор кода доступа к массиву (ну, вы могли бы, а затем выполнить его с помощью eval , но вы действительно не не хочу этого делать если нет другого выхода).

Лучший способ — передать аргументы вспомогательной функции, которая затем будет постепенно перебирать целевой массив, используя каждый из предоставленных аргументов.

Другая задача, конечно, состоит в том, чтобы разбить строку URL на части с помощью explode. Похоже, вы хотите игнорировать первые части (протокол и домен) и просто смотреть на элементы пути.

Этот код должен делать то, что вам нужно, я думаю:

function flatCall($data_arr, $data_arr_call){
    $current = $data_arr;
    foreach($data_arr_call as $key){
        $current = $current[$key];
    }

    return $current;
}

$MAP = array("profile" => array("setting" => array("test" => array("idknow" => "someValue"))));
$urlString = "www.example.com/profile/setting/test/idknow";

$URL = explode("/", $urlString); //split URL string into an array
array_shift($URL); //remove first element
$result = flatCall($MAP, $URL);
echo $result;

Живая демонстрация: https://3v4l.org/A3Z1H


Кредит https://stackoverflow.com/a/36334761/5947043 для вспомогательной функции - прочитайте этот ответ для объяснения того, как это работает.

Другие вопросы по теме