[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Переменная содержит ответ, но он не возвращается
Страницы: 1, 2
Altai
Цитата (kaww @ 14.11.2013 - 20:19)
Потомучто функция не всегда что-то возвращает. Теперь всегда:

 return MyArray($array); 


З.Ы. Чтобы понять рекурсию нужно понять рекурсию.


О! Спасибо!! Всё заработало! Но тогда не понятно, а почему же всё-таки из IF не возвращается результат, ведь функция то до него доходит... И print_f это подтверждает...



Цитата (kaww)

Если следовать этой логике, то "Есть строка:" и array ("Пожалуйста,|Просто|Если сможете,") тоже не разделены как и в свою очередь  array ("Пожалуйста,|Просто|Если сможете,") и "сделайте так, чтобы это" и т.д. Короче либо так объясняешь, либо сам не до конца въехал в суть задачи  ;)


Чтоб понятней было, вот задача полностью:

"Есть строка: {Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}. Необходимо раскрыть фигурные скобки и получить строку. | значит, что допустимо одно из указанных значений, то есть {крутое|простое} значит, что выведется ТОЛЬКО крутое или ТОЛЬКО простое. Вложенные фигурные скобки так же должны раскрываться, значит: {простое|очень {сложное|удачное}} в итоге получим на выходе один из трёх вариантов: \"простое\", \"очень сложное\", \"очень удачное\". Важно, что вложенность может быть бесконечной. Сюда же добавлю, что есть вторая интерпретация этой задачи, необходимо составить массив со всеми возможными вариантами строки, то есть не случайное раскрытие, а все допустимые варианты.."

Обрати внимание на этот отрывок: {простое|очень {сложное|удачное}} в итоге получим на выходе один из трёх вариантов: \"простое\", \"очень сложное\", \"очень удачное\"

Т.е. это 2 варианта: или "простое" или "очень {сложное|удачное}"
А не 3 - "Простое", "Очень", и "{Сложное|удачное}" т.к. разделительный символ только между "Простое" и "очень {сложное|удачное}"

То же самое и с тем отрывком - разделительный символ между изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз

Даже по смыслу если читать, то это только 2 варианта.

А по поводу "Есть строка:" и array ("Пожалуйста,|Просто|Если сможете,")
То мы делаем выборку только из того, что в фигурных скобках. "Есть строка:" - не в фигурных скобках, обычный текст, в который должен вставиться один из вариантов, что в фигурных скобках.

В общем не забивай себе голову :) Это я больше для себя хочу сделать, т.к. учусь программировать на php и практика нужна. Ещё раз спасибо за помощь!
Altai
В общем, целую неделю мучался с этим скриптом, днём и ночью думал только о нём, даже в депресняк впал и начал спиваться :) Но вот он и готов! Он идеален (для меня)! Даже вот эта часть правильна: {изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}. И я доволен собой, как никогда! Если вдруг он кому-то когда-то понадобится, то вот он, мой шедевр :) Держите, и пользуйтесь на здоровье!

p.s. Большое спасибо всем, кто помогал! Родина вас не забудет!


<?php
$str ="Есть строка: {Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное}
тестовое предложение {изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}"
;

function myParser(&$string, $open = '{', $close = '}') {
$result = array();
$i = 0;
while ($strelen = strlen($string)) {
$l = substr($string, 0, 1);
$string = substr($string, 1, $strelen - 1);
if ($l == $open) {
$result[++$i] = myParser($string, $open, $close);
++
$i;
} else if ($l == $close) {
break;
} else {
if (!isset($result[$i])) {
$result[$i] = '';
}
$result[$i] .= $l;
}
}

return $result;
}

$result = myParser($str);

function ExplodeArray($array){
$t=0;
if (!is_array($array[0])) {
if (isset ($array[1])) {
if(!is_array($array[1])) {;
$array[0].=$array[1];
unset ($array[1]);
$array=array_values($array);
$t++;
}
else {$t++; $array[1]=ExplodeArray($array[1]);}
}
}

else {$t++; $array[0]=ExplodeArray($array[0]); }
if ($t>0) return ExplodeArray($array);
else {
if (strpos($array[0],"|")) {
$test=explode("|",$array[0]);
$array=$test[mt_rand(0,count($test)-1)];
return $array;
}
else return $array[0];
}
}


print (ExplodeArray($result));
?>
Быстрый ответ:

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