Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Введение информации в функцию
 
 автор: Владимир55   (07.01.2009 в 12:02)   письмо автору
 
 

Отношения с функциями рнр у меня перпендикулярные: я не понимаю их, а они не понимают меня. Посвященные функциям страницы Самоучителя рнр залистал до дыр, но толку немного, ибо практика гораздо хитрее приведенных там сведений.

Вот, к примеру, в приведенную ниже функцию нужно извне добавить массив $mass и переменную $lim. И пусть ниже строки
echo $check."<br>"; 
внутри фунции выполняется выражение
for ($i=0; $i <= $lim; $i++) echo $mass[$i}, "<br>";


Вот как это сделать?
(логического смысла тут не заложено, а исключительно в познавательных целях)

$root  =  $_SERVER['DOCUMENT_ROOT'];  
function find_new($dir) 
{         

$new_dir = null;      
$dir_files = opendir($dir);     
    while(false !== ($file = readdir($dir_files))) 
    {  

        if($file != '.' && $file != '..')  
        $new_dir[] = $dir."/".$file; 
    } 
         
        if($new_dir) 
        foreach($new_dir as $check ) 
        { 
              if(is_file($check))    
              echo $check."<br>";                  
              elseif(is_dir($check)) 
              find_new($check);  
        } 
}     
find_new($root); 

  Ответить  
 
 автор: Николай2357   (07.01.2009 в 12:15)   письмо автору
 
   для: Владимир55   (07.01.2009 в 12:02)
 

Передать значения в функцию можно несколькими способами.
1. По ссылке. Это когда Вы делаете так:
<?
find_new
($dir,$mass)

2. Объявив её глобальной. Вот так:
<?
function find_new($dir)  
{     
glob $mass;

3. Внутри функций видны константы. Но это уже не переменная.

  Ответить  
 
 автор: BinLaden   (07.01.2009 в 12:18)   письмо автору
 
   для: Николай2357   (07.01.2009 в 12:15)
 

> По ссылке. Это когда Вы делаете так:
Это когда делают так:
<?php
function find_new($dir, &$mass)
?>

  Ответить  
 
 автор: Владимир55   (07.01.2009 в 12:38)   письмо автору
 
   для: BinLaden   (07.01.2009 в 12:18)
 

А что бы добавить две переменные? Так:
function find_new($dir, &$mass, &lim)


А как вызывать с тремя переменными? Так?
find_new($root, &$mass, &$lim);  

  Ответить  
 
 автор: Николай2357   (07.01.2009 в 13:12)   письмо автору
 
   для: Владимир55   (07.01.2009 в 12:38)
 

По такой схеме просто, без амперсанда
<?
function find_new($dir$mass$lim)

<?
find_new
($root$mass$lim);

  Ответить  
 
 автор: Владимир55   (07.01.2009 в 14:36)   письмо автору
 
   для: Николай2357   (07.01.2009 в 13:12)
 

Самое смешное (для меня) состоит в том, что именно так я и делал! И код не работал. Он и сейчас не работает.

В полном виде код можно записать так:
$mass[] = "ABC";
$mass[] = "BCD";
$mass[] = "CDE";
$mass[] = "FFF";
$lim    = 2;

$root  =  $_SERVER['DOCUMENT_ROOT'];

function find_new($dir, $mass, $lim)
{

for ($i=0; $i <= $lim; $i++) echo $mass[$i], "<br>";

$new_dir = null;
$dir_files = opendir($dir);
    while(false !== ($file = readdir($dir_files)))
    {

        if($file != '.' && $file != '..')
        $new_dir[] = $dir."/".$file;
    }

        if($new_dir)
        foreach($new_dir as $check )
        {
              if(is_file($check))
              echo $check."<br>";
              elseif(is_dir($check))
              find_new($check);
        }
}
find_new($root, $mass, $lim);
Выводимая ошибка завит от того, куда я вставляю проверочную строку
for ($i=0; $i <= $lim; $i++) echo $mass[$i], "<br>";
Если эта строка стои там, где сейчас, или если ее вообще нет, то диагностика такая:
Warning: Missing argument 2 for find_new() in 977.php on line function find_new($dir, $mass, $lim)

Как же справиться с этой функцией?

  Ответить  
 
 автор: Trianon   (07.01.2009 в 15:26)   письмо автору
 
   для: Владимир55   (07.01.2009 в 14:36)
 

в рекурсивном вызове список параметров тоже надо поправить.

  Ответить  
 
 автор: Николай2357   (07.01.2009 в 15:36)   письмо автору
 
   для: Владимир55   (07.01.2009 в 14:36)
 

Вы лучше скажите, чего Вы из этого скриптика хотите получить?

  Ответить  
 
 автор: Владимир55   (07.01.2009 в 16:46)   письмо автору
 
   для: Николай2357   (07.01.2009 в 15:36)
 

"Вы лучше скажите, чего Вы из этого скриптика хотите получить?"
Как я написал с самого начала, сам по себе мне этот скрипт уже не нужен, ибо всё решено, что с ним было связано. А дело в том, что я никак не могу научиться работать с функциями - ни составлять их сам, ни вносить даже небольшие изменения в написанные кем-то другим.
А хочется разобраться, хотя бы на этом примере.

для Trianon
"в рекурсивном вызове список параметров тоже надо поправить."
Кабы знать, как поправить...

  Ответить  
 
 автор: Николай2357   (07.01.2009 в 16:50)   письмо автору
 
   для: Владимир55   (07.01.2009 в 16:46)
 

В рекурсивном - это значит вызв функции самой себя. Найдите вызов внутри функции и проставьте там те же переменные.

  Ответить  
 
 автор: Николай2357   (07.01.2009 в 17:01)   письмо автору
 
   для: Николай2357   (07.01.2009 в 16:50)
 

А вообще, функция, это довольно просто и чертовски удобно. Работает в теле функции все так же как и везде, а удобство заключается в том, что это ни кому не мешает. Научиться очень просто. Пишите обычный код, а потом вокруг него ставьте
<?
function my_func()
{
// Ваш код
return $result;
}

$result - это результат вычислений. Он будет передан переменной (или другой функции), которая вызывает Вашу.
То есть так:
<?
function my_func()
{
$a "HELO, ";
$b "World!";
for(
$i=0$i 10$i++)
$c .= "!";
$result $a.$b.$c;
return 
$result;
}
$okak my_func();
echo 
$okak;

  Ответить  
 
 автор: Владимир55   (07.01.2009 в 17:09)   письмо автору
 
   для: Николай2357   (07.01.2009 в 16:50)
 

Спасибо, теперь я понял суть дела.
И всё заработало.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования