Я знаю базовый 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--;
?>
Задача ещё не решена.
Других решений пока нет …