Forum Webscript.Ru
Программирование => PHP => Тема начата: КубанГ от 22 Января 2006, 05:52:45
-
Привет, вопрос:
Подскажите пожалуйста, каким образом можно динамически подставлять переменную в if, когда один из параметров для сравнения передаётся за пределами функции. Мне сложно объяснить, посмотрите код. Я хотел сделать так, чтобы 4 раза не создавать условие, отдельно для kids_status, отдельно для parents_status и т. д. При этом название категорий будет использоваться и в дальнейшем, поэтому желательно заранее определить их, а семантически зависимые от них переменные создавать методом подстановки к исходному.
function status (parents_status, kids_status, ...) {
$category = array ("kids", "parents", "leader", "about");
if ("$" . $category["здесь перебор массива"] . "_status" == 1){
echo ("" . "и" . php-код);
}
}
status (1);
"$" . $category["здесь перебор массива"] . "_status" == 1
Здесь, конечно же ничего не работает:
"$" . $category["здесь перебор массива"] . "_status" равно на самом деле "$kids_status" (и
т. д.)
-
надеюсь, когда ты проснёшься, то сам поймёшь, что это бред.
-
зачем тебе вообще знать имена переменных?
зачем что-то подставлять, собирать из кусков?
надо тебе перебрать все переданные функции параметры - ну так перебирай! Вообще не зная их имён.
-
RomikChef:
надеюсь, когда ты проснёшься, то сам поймёшь, что это бред.
Мне казалось, что если бы это сработало, то было бы очень элегантным :) решением (во всяком случае для меня). Но я понял, о чём ты говоришь (надеюсь что). Смотри:
function status () {
for ($i = 0; $i <= 3; $i++) {
if (func_get_arg($i) == 1){
echo ("" . "и" . php-код);
}
}
}
status (1, 1, 1, 0);
Самое интересное, что это работает ^_^
-
функция не должна выводить html код
ты создаёшь чудовищное в плане поддержки приложение.
-
RomikChef:
функция не должна выводить html код ты создаёшь чудовищное в плане поддержки приложение.
В таком случае я могу вынести весь html за пределы функции, но, например, то, что я называю php-код это тоже по сути чистый html, просто "занесённый" в переменную. Насколько это будет менее вульгарно? То, что я пытаюсь сделать -- меню для сайта, которое может различаться для каждой отдельной странички. Возможно стоит попробовать Java Script, но в нём я разбираюсь ещё хуже.
-
Ещё один вопрос в тему. А что если нужно работать с многомерным массивом? Каким образом
можно сделать его перебор в зависимости от условий?
$abc = array (
"one" => array ("a1", "a2", "a3"),
"two" => array ("b2", "b2"),
"three" => array ("c1", "c2")
);
И работать с ним по тому же принципу:
if ($i эллемент, переданый через функцию = 1) {
вывести $i эллемент многомерного массива,оформленный так-то и плюс всё, что внутри него самого (этого массива в массиве) }
else {
вывести этот же эллемент многомерного массива, оформленный по другому и
if ( $число, иереданное через функцию = $порядковый номер эллемента вложенного массива) { плюс к нему, всё, что внутри него, но так же в зависимости от условия, когда один из элементов уже второго массива отображается отлично от остальных эллементов этого же массива (в частности из него, например, вырезаются все html-теги)
Вот такая заковырка. Каким образом это организовать -- ума не приложу. Думал и так и так.
foreach ($this->menu as $cKey => $category) {
echo ("" . $cKey . "
");
foreach ($category as $link) {
echo ($link);
}
}
Но здесь невозможно сделать вывод в зависимости от условий (я пробовал -- не получилось).
-
КубанГ
$array = array(...);
$num = 1;
for($i=0;$i for($j=0;$j if($j==$num) { //или что угодно
echo($i." ".$j." !!!\\n");
//do some shit
} else {
echo($i." ".$j."\\n");
//do other shit
}
}
}
А вообще - банально почитать любые книги по программированию.
-
CGVictor
Прости, но ты меня не совсем правильно понял (и уж совершенно зря запозорил :() Тут моя вина: в следующий раз мне нужно более точно изъясняться. На самом деле проблема не в том, чтобы просто перебрать массивы в массиве и вывести цифры, соответствующие порядковым номерам эллементов этих массивов. Я не могу понять, каким образом вывести значения этих элементов. И если ещё возможно отобразить первый массив (см. код, впрочем, хотелось больше автоматизации) (таким образом, как ты показал -- на самом нельзя, т. к., например, первый эллемент массива это не "1", а "One" и потому простая подстановка array[$i] не подходит). А со вложенными массивами ещё сложнее (во всяком случае для меня). А твой код более "жизненно" выглядит так:
function status ($link)
{
$array = array (
"one" => array ("a1", "a2", "a3"),
"two" => array ("b2", "b2"),
"three" => array ("c1", "c2")
);
for($i = 0; $i < count($array); $i++) {
$category = array ("One", "Two", "Three");
if (func_get_arg($i) == 1){
echo ("" . $category[$i] . "
");
for($j = 0; $j < count($array[$i]); $j++) {
echo ($j . "
");
}
}
else{
echo ("" . $category[$i] . "
");
for($j = 0; $j < count($array[$i]); $j++) {
if($link == $j) {
echo ($j . "
");
}
else {
echo ("" . $j . "
");
}
}
}
}
}
status (1, 0, 1, $link = 2);
Важно, чтобы итоговый вывод в браузер был таким:
One
a1
a2
a3
Two
b1
...
Извини, если я опять чего-то не понял :)
-
КубанГ:
Но здесь невозможно сделать вывод в зависимости от условий
каких ещё условий?
-
CGVictor
CGVictor:
А вообще - банально почитать любые книги по программированию.
[OFF]На самом деле у такого большого ламо как я, который садится за PHP, когда припрёт есть тоже очень большой учебник, который называется "Professional PHP4". С какого перепуга я его купил -- не знаю (но купил). И в критические моменты своей жизни я открываю этот талмуд и умилённо смотрю целыми днями, как баран на новые ворота...
Вот такая печальная история...[/OFF]
-
ты путаешь учебник со справочником.
Учебник открывают не в тяжкую годину.
а заранее.
чтобы научиться делать то, что ты собрался делать.
А столкнувшись с конкретной проблемой, лезут в справочник.
-
RomikChef
RomikChef:
каких ещё условий?
Я имел ввиду то, что когда пытаешься написать примерно следующее:
if (func_get_arg($i) == 1){
foreach ($this->menu as $cKey => $category) {
echo ("" . $cKey . "
");
foreach ($category as $link) {
echo ($link);
}
}
То в браузер выводится всё по 4 раза! И как этим управлять, я не понимаю.
-
RomikChef
RomikChef:
А столкнувшись с конкретной проблемой, лезут в справочник.
[OFF]Я не думаю, что я уж настолько плох в программировании (хе-хе :)), чтобы не научиться пользоваться тем, что я понимаю и тогда, когда знаю, что и где применять. Справочник в этом определённо помогает. Но когда просто не знаешь, как действовать в той или иной ситуации и за ответами лезешь в учебник, а том всё на более или менее на общих примерах... Опыта, конечно, маловато, но чтобы его набираться надо программировать хотя бы чаще, чем раз в квартал![/OFF]
-
КубанГ
КубанГ:
Я не могу понять, каким образом вывести значения этих элементов.
Совсем ничего я уже тут не понимаю.
используй array_keys() и обращайся $array[$keys[$i]]...или опять не то?
-
CGVictor
CGVictor:
используй array_keys() и обращайся $array[$keys[$i]]...или опять не то?
Надо обмозговать...
CGVictor:
Совсем ничего я уже тут не понимаю.
Просто в итогом должен быть следующий вывод в браузер:
One
а1 (http://#)
а2 (http://#)
а3 // без ссылки, потому что $link = 2 (3 эллемент в массиве)
Тwо
b1 (http://#)
b2 (http://#)
Three
c1 (http://#)
c2 (http://#)
Чёрт, ну я и намудрил! Может есть способ попроще ^_^? Это же меню по типу раскрывающегося списка. Есть три категории и в каждой несколько ссылок. Если раздел на сайте одной из категорий (списка) уже загружен -- значит у неё не должно быть возможности открываться/закрываться -- список неактивен. И не активна ссылка, которая ссылается на загруженую страницу! Ведь всё так просто :)! Уфф. "Вся королевская конница, вся корлевская рать..."
Просто на каждой странице я не хочу выводить меню руками (вдруг надо будет изменить что-то -- значит придётся менять на каждой странице), а просто написать status (1,1,0, $link = 2), что будет означать: 1, 2 разделы -- активны, 3 -- нет и в нём не активна 3 ссылка.
Извините, что огород нагородил.
-
КубанГ:
То в браузер выводится всё по 4 раза!
то есть, у тебя 4 условия, 4 цикла, и ты спрашиваешь, почему выводится 4 раза???
КубанГ:
Я не думаю, что я уж настолько плох в программировании
ты просто ЧУДОВИЩНО заблуждаешься
-
RomikChef:
ты просто ЧУДОВИЩНО заблуждаешься
Я надеюсь, что ты хотел сказать, что я слишком строг к себе, недооцениваю свои способности...
-
как угодно.
собственно, если человек не способен вставить условный переход внутрь цикла, то о способностях тут вообще речь не идёт.
а ноль ты можешь хоть недооценивать, хоть переоценивать.
-
RomikChef
RomikChef:
собственно, если человек не способен вставить условный переход внутрь цикла, то о способностях тут вообще речь не идёт.
[OFF]Не буду оправдываться, хотя бы потому что незачем. Ты суров, но справедлив Но всё равно немного строг (а где позитивим, вера в коллективный разум, идеи Вернатского? Вот так всё лучшее пропадает в профессионализме!). Ну ты хотя бы веришь в моё светлое будущее? Впрочем, это не имеет к теме никакого отношения (но всё равно спасибо за замечания) (вот порадуется тот, кто действительно захочет научиться и зайдёт сюда). Я попробую разобраться с тем, что заварил.[/OFF]
RomikChef
CGVictor:
Спасибо, ребята, я, наверное, уже на полпути к просветлению благодаря вам :)!