[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как сделать функцию из существующего кода
Юрий Шу
Здравствуйте.
Есть вот такой рабочий код, вернее, часть кода.
PHP
// считаем количество строк итогового массива
$nn=count($RESULT);

//дописываем в существущий массив колонку с отзывом (0 или 1)
for($i=0;$i<$nn;$i++) {
 $filename = 'rus/partners/solutions/response.jsp?solutionID='.$RESULT[$i][0];
 $content = file_get_contents ($filename);
 $otziv = strpos ($content, "<h3>Неверные параметры запроса</h3>");
 if ($otziv == true) {$RESULT[$i][3] = 0;}
 else { $RESULT[$i][3] = 1; }
}

Можно ли код, дописывающий в массив новые значения, сделать функцией??
С каким параметром будет эта функция и как ее вызвать?

P.S. Только начал писать на PHP и сомневаюсь, нужно ли здесь использование функции вообще, если код рабочий.

Что даст ее использование в данной программе??
Заранее спасибо за ответы.



Спустя 2 часа, 29 минут, 19 секунд (19.01.2009 - 16:23) Adamant написал(а):
Я немного укоротил ваш код
PHP
/**
*  Дописываем в существущий массив колонку с отзывом (0 или 1)

*  @param array $RESULT
*  @return array $RESULT
*/
function array_add($RESULT)
{
    
//дописываем в существущий массив колонку с отзывом (0 или 1)
    
for ($i 0$i count($RESULT); $i++) {
        
$RESULT[$i][3] = (strpos(file_get_contents('rus/partners/solutions/response.jsp?solutionID=' $RESULT[$i][0]),
                                 
"<h3>Неверные параметры запроса</h3>") === true) ? 1;
    }
    return 
$RESULT;
}


IMHO:
Если ваша функция будет вызываться (использоваться) несколько(много) раз то можно и создать ее. Если это повышает читабельность кода или вам так удобнее, то не вижу причины "отказывать себе в удовольствии" biggrin.gif Если вам будет интересно мое мнение, то лично я бы не создавал бы эту функцию, но опять таки, все зависит от конкретной ситуации. Так что вы "Только начал писать на PHP", то вам для тренировки не помешает. В дальнейшем вам уже будет понятно когда стоит писать функцию, а когда она ни к чему.

Спустя 59 минут, 31 секунда (19.01.2009 - 17:23) Юрий Шу написал(а):
Adamant, а вызывать это функцию где??
сразу после определения??

Как она вызывается?
PHP
array_add($RESULT)

Так?

Спустя 9 минут, 57 секунд (19.01.2009 - 17:33) sergeiss написал(а):
Функции определять можно в любом месте скрипта.
И вызывать в любом месте. Порядок определения и вызова функций не важен.

Можно даже сделать отдельный файл для них, и подключать его через include(). Это очень удобно в случае, если одни и те же функции используются в разных скриптах.

Да, и вызывается она именно так. Только надо учесть, что $RESULT при вызове функции и внутри нее - это разные переменные!!! И возвращать из функции можно всё, что угодно (простые переменные и массивы). Можно даже ничего не возвращать smile.gif

Спустя 4 часа, 12 минут, 51 секунда (19.01.2009 - 21:46) Adamant написал(а):
Юра, ну почему вы не читаете мануал?
http://ru2.php.net/manual/ru/language.functions.php

Скачать русский мануал по PHP (размер: 7 Мб)

Спустя 11 часов, 29 минут, 54 секунды (20.01.2009 - 09:16) Юрий Шу написал(а):
Цитата (sergeiss @ 19.01.2009 - 14:33)
Да, и вызывается она именно так. Только надо учесть, что $RESULT при вызове функции и внутри нее - это разные переменные!!!

А как сделать, чтобы это была одна и та же переменная?? По ссылке передавать?

Вот так вроде работает, только не с «=== true», а с «== true».
PHP
function array_add(&$RESULT){ 
        for 
($i = 0; $i < count($RESULT); $i++) {
        $RESULT[$i][3] = (strpos(file_get_contents('rus/partners/solutions/response.jsp?solutionID=' . $RESULT[$i][0]),
        "<h3>Неверные параметры запроса</h3>") == true) ? 0 : 1;
    }
    return $RESULT;
}

array_add($RESULT);

P.S. Кстати, Ваш укороченный код как-нибудь отразится на скорости работы скрипта или все останется при своих примерно? smile.gif
И есть ли разница в скорости при работе с функцией и без нее?

Спасибо.

Спустя 7 часов, 57 минут, 6 секунд (20.01.2009 - 17:13) Adamant написал(а):
Пример передачи массива в функцию по ссылке:

PHP
$RESULT = array(array(0, 1, 2, 3), 
                 array
(0, 11, 22, 33));
                
array_add
($RESULT);

function array_add(&$array)
{
    //дописываем в существущий массив колонку с отзывом (0 или 1)
    for ($i = 0; $i < count($array); $i++) {
        $array[$i][3] = (strpos(file_get_contents('rus/partners/solutions/response.jsp?solutionID=' . $array[$i][0])),
                                 "<h3>Неверные параметры запроса</h3>") !== false) ? 0 : 1;
    }
}


Функция возвращает массив:

PHP
$RESULT = array(array(0, 1, 2, 3), 
                 array
(0, 11, 22, 33));
                
$new_array 
= array_add($RESULT);

function array_add($array)
{
    //дописываем в существующий массив колонку с отзывом (0 или 1)
    for ($i = 0; $i < count($array); $i++) {
        $array[$i][3] = (strpos(file_get_contents('rus/partners/solutions/response.jsp?solutionID=' . $array[$i][0])),
                                 "<h3>Неверные параметры запроса</h3>") !== false) ? 0 : 1;
    }
    return $array;
}

Теперь -
Цитата (Юрий Шу @ 20.01.2009 - 13:16)
P.S. Кстати, Ваш укороченный код как-нибудь отразится на скорости работы скрипта или все останется при своих примерно?

По сути даже быстрей будет, быстрей будет может на миллионную(миллиардную) долю секунды (точно не скажу). Дело в том что в вашем коде предварительно идут 3 строки где переменным присваиваются результаты работы функций, а уж потом результирующая переменная проверяется в конструкции if (). Я все ваши действия "скомпоновал" в одну строку, исключив ненужного предварительного создания переменных. Код стал компактнее и читабельнее.

Цитата (Юрий Шу @ 20.01.2009 - 13:16)
И есть ли разница в скорости при работе с функцией и без нее?

Разница конечно имеется, с функцией будет дольше, может быть тоже на несколько миллионных(миллиардных) долей секунды. Так что не стоит об этом задумываться. user posted image

Спустя 48 минут, 36 секунд (20.01.2009 - 18:01) Adamant написал(а):
Как сказал sergeiss. удобно делать так, даже если в вашем проекте одна функция стоит вынести ее в отдельный файл и потом его подключать в нужный файл. Естественно если ваш скрипт состоит всего из пары файлов, то можно так и не делать. Какие плюсы это дает:
1. Вы всегда знаете где находятся ваши функции в вашем проекте.
2. Например, вы пишете проект и вам нужно написать функцию, и вы вспоминаете, что вы писали похожую (или такую же) в прошлом проекте и чтобы вам не думать, в каком же файле ее искать, вы открываете ваш отдельный файл с функциями (например я для него в проекте создаю отдельную папку(common) и там файл f.inc или можно function.inc и туда "кладу" все мои функции которые пишутся в процессе написания проекта) в вашем прошлом проекте и спокойно ее оттуда берете.

Обязательно подробно пишите в начале каждой вашей функции, что она делает, входящие параметры и что она возвращает.
пример:
function.inc
PHP
/**
* Дописываем в существующий двумерный массив в каждую [3] колонку($array[][3]):
*  0 - если (Пишем условие)
*    иначе 
* 1 

* @param array $array
*/
function array_add(&$array)
{
    for ($i = 0; $i < count($array); $i++) {
        $array[$i][3] = (strpos(file_get_contents('rus/partners/solutions/response.jsp?solutionID=' . $RESULT[$i][0])),
                                 "<h3>Неверные параметры запроса</h3>") !== false) ? 0 : 1;
    }
}


action.php
PHP
require_once 'function.inc';

$RESULT = array(array(0, 1, 2, 3), 
                 array
(0, 11, 22, 33));
                
array_add
($RESULT);

Спустя 19 часов, 12 минут, 39 секунд (21.01.2009 - 13:14) Юрий Шу написал(а):
Adamant, огромное спасибо за подробные разъяснения.
Только позвольте уточнить…

1) Почему в случае, када параметры функции передаются по ссылке массив не возвращается в определении функции??
2) Для чего переменной $new_array присваивается вызов функции??
3) Я так понял функцию и в первом и во втором случае можно вызывать и до и после определения?

P.S. Может слегка глупые вопросы про функции, но читал мануал несколько раз, так и не уяснил себе разницы и принципа работы в этих двух случаях.

P.P.S. А почему у отдельного файлика расширение .inc? Почему не .php?

Спустя 3 часа, 43 минуты, 12 секунд (21.01.2009 - 16:57) Adamant написал(а):
Цитата (Юрий Шу @ 21.01.2009 - 17:14)
1) Почему в случае, когда параметры функции передаются по ссылке массив не возвращается в определении функции??

Если объект передается в функцию по ссылке, это значит мы функции "передаем" адрес ячейки где находится сам объект, и функция работает (изменяет) непосредственно с самим объектом и следовательно функции не нужно возвращать измененный объект. Например так работает функция sort(). Например в языке Си, нельзя передать в функцию массив, это можно сделать только по ссылке.

Если функция возвращает объект, механизм работы другой. Мы указываем функцию наш объект. Функция его копирует и создает его полную точную копию, и потом работает только с этой копией, которая кстати существует только пока работает сама функция (исключение - static) и так как сам объект не изменяется, нужно вернуть результат работы посредством return.

Цитата (Юрий Шу @ 21.01.2009 - 17:14)
3) Я так понял функцию и в первом и во втором случае можно вызывать и до и после определения?

В PHP3 функции должны были быть определены прежде, чем они будут использованы. Начиная с PHP 4 такого ограничения нет (исключая тот случай, когда функции определяются условно). Немного подробнее. Прежде чем "запустить код скрипта на выполнение" интерпретатор его считывает одновременно анализируя на ошибки, и когда весь код прочитан(и нет FATAL ERROR) он преобразуется интерпретатором во внутренний код - опкод, который после этого и запускается. Поэтому нет разницы в каком месте скрипта идет определение функции.

Цитата (Юрий Шу @ 21.01.2009 - 17:14)
P.P.S. А почему у отдельного файлика расширение .inc? Почему не .php?

inc - include. Чтобы сразу было видно, что он подключается к скриптам. Расширение в этом случае не имеет значение, можно хоть function.lib (library).



Спустя 17 минут, 21 секунда (21.01.2009 - 17:14) Юрий Шу написал(а):
Adamant, тысяча благодарностей wink.gif
Быстрый ответ:

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