Цикл по неопределенному количеству цепочек

Я знаю базовый PHP и все, что я узнал в Google за последние годы.
С учетом сказанного я занимаюсь разработкой нового веб-сайта и экспериментирую с чистыми URL-адресами для целей SEO и совместимости с несколькими региональными языками.

Итак, у меня есть этот массив:

$list['requests']['en'] = array(
'index' => array(
0,
'subscribe',
'search'
),
'services' => array(
0,
'next' => array(
'service1',
'service2',
'service3'
),
'subscribe',
'search'
),
'service1' => array(
0,
'subscribe'
),
'service2' => array(
1,
'next' => array(
'view'
),
'jump' => 1,
'subscribe',
'search'
),
'service3' => array(
1,
'subscribe',
),
'view' => array(
2,
'subscribe'
),
'bad-request' => array(
0,
'subscribe'
)
);

куда $list['requests']['en'][$page][0] это уровень страницы в URL и $list['requests']['en'][$page]['next'] список допустимых страниц, которые могут следовать
Этот массив используется для проверки URL-адресов, поэтому он является допустимым: www.website.com/services/service2/view

Моя настоящая проблема заключается в том, что я хочу зациклить этот массив и проследить каждую страницу в списке «следующий», поэтому у меня есть функция для создания таких файлов: en / services.service1.view.php

Я уже создал цепочку циклов, которые делают эту работу, но она не является общей. Это ограничено количеством циклов, которые я печатаю в себе. Этот код, например, работает только через 4 цикла:

if(isset($list['requests'][$lang][$list_keys[$j]]['next'])){
for($l = 0; !empty($list['requests'][$lang][$list_keys[$j]]['next'][$l]) && $l < $for_max; $l++){
$next = $list['requests'][$lang][$list_keys[$j]]['next'][$l];

$file_next = $file[0].'.'.$next;
$file[] = $file_next;

if(isset($list['requests'][$lang][$next]['next'])){
for($n = 0; !empty($list['requests'][$lang][$next]['next'][$n]) && $n < $for_max; $n++){
$next_1 = $list['requests'][$lang][$next]['next'][$n];

$file_next_1 = $file_next.'.'.$next_1;
$file[] = $file_next_1;

if(isset($list['requests'][$lang][$next_1]['next'])){
for($o = 0; !empty($list['requests'][$lang][$next_1]['next'][$o]) && $o < $for_max; $o++){
$next_2 = $list['requests'][$lang][$next_1]['next'][$o];

$file_next_2 = $file_next_1.'.'.$next_2;
$file[] = $file_next_2;

if(isset($list['requests'][$lang][$next_2]['next'])){
for($p = 0; !empty($list['requests'][$lang][$next_2]['next'][$p]) && $p < $for_max; $p++){
$next_3 = $list['requests'][$lang][$next_2]['next'][$p];

$file_next_3 = $file_next_2.'.'.$next_3;
$file[] = $file_next_3;

}
}
}
}
}
}
}
}

Этот код сохраняет каждое уникальное имя файла из цепочки массивов.
Вывод будет примерно таким:

index.php
services.php
services.service1.php
services.service2.php
services.service2.view.php
services.service3.php
...

Я пытался сделать общие функции для этого, но безуспешно.
Есть идеи?

РЕДАКТИРОВАТЬ:
Я только что предложил идею упростить код с помощью включения. Неважно, мои переменные, смысл в том, чтобы создать сценарий, который воспринимает глубину самих циклов.

Скрипт дыры с целью контекста:

<?php
include 'includes/lists/languages.php';
include 'includes/lists/requests.php';

$for_max = 15;

// create requests files for each language
for($i = 0; isset($list['languages'][$i]) && $i < $for_max; $i++){
$lang = $list['languages'][$i];
$requests_keys = array_keys($list['requests'][$lang]);

echo 'LANG: '.$lang.'<br/>';

for($j = 0; isset($list['requests'][$lang][$requests_keys[$j]]) && $j < $for_max; $j++){
if($list['requests'][$lang][$requests_keys[$j]][0] == 0){
$file = array();
$file[] = $requests_keys[$j];


/*   NEXT PART LOOP   */
$loop = array();
$depth = 0;
$part = array();
$part['next'] = array();
$part['file'] = array();

// these vars are unique for the first loop, then it's generic
$part['next'][$depth-1] = $requests_keys[$j];
$part['file'][$depth-1] = $file[0];

// loop through every 'next' part if it exists in the current part
if(isset($list['requests'][$lang][  $part['next'][$depth-1]  ]['next'])){
include '___construct_files.recursive.php';
}


/*   CREATE REQUEST FILE  */
for($k = 0; $k < count($file); $k++){
$path = 'includes/requests/'.$lang.'/'.$file[$k].'.php';

// string to insert in the file
include '___construct_files.string.php';

// processing
if(!file_exists($path)){
file_put_contents($path, $string);
echo '<br/># created - '.$path.'<br/>';

}else if(file_exists($path)){
echo '<br/># exists - '.$path.'<br/>';

}else{
echo '<br/># error - '.$path.'<br/>';

}
}
}
}

echo '<br/><br/>';

}

?>

Цикл включается и проверяет, нужно ли его снова включать в себя (___ construct_files.recursive.php):

<?php
for($loop[$depth] = 0; !empty($list['requests'][$lang][  $part['next'][$depth-1]  ]['next'][  $loop[$depth]  ]) && $loop[$depth] < $for_max; $loop[$depth]++){
$part['next'][$depth] = $list['requests'][$lang][  $part['next'][$depth-1]  ]['next'][  $loop[$depth]  ];

$part['file'][$depth] = $part['file'][$depth-1].'.'.$part['next'][$depth];
$file[] = $part['file'][$depth];

// if next part is set, increase depth and include loop
if(isset($list['requests'][$lang][  $part['next'][$depth]  ]['next'])){
$depth++;

include '___construct_files.recursive.php';
}

}
// decrease depth when higher depth loop ends so the current loop can resume
$depth--;

?>

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector