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

Форум PHP

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

 

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

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

тема: Обращение к функции в цикле
 
 автор: devil943   (07.01.2009 в 15:07)   письмо автору
 
 

Вот функция, котороя работает по типу array_search:
function statistic_array_search($string,$array) {
    if($array) return false;    
    $p = 0;
    for($i=0;$i<count($array);$i++) {
        if($array[$i] == $string) {
            $p = 1;                        
            return $i;
            break(1);
        }
    }
    if($p == 0) return false;
}


Есть цикл while($n = mysql_fetch_assoc($r)) { который пробегает на данный момент около 70 раз.
Далее разными преобразованиями полчается переменная $ref, которая в идеале для каждого пробега разная, но на практике частенько повторяется.
Далее идет условие
if(!statistic_array_search($ref, $referer['referer'])) {
Тут $ref наша полученная строка, а $referer['referer'] - двумерный массив, второй ключ - счетчик. Если в массиве мы НЕ наши совпадение со строкой ref (именно точное), то записываем
$referer['referer'][$num] = $ref; и увеличиваем счетчик $num++;

В итоге в массиве $referer['referer'] все строки должны быть разными.

Но проблема в том, что программа ПОЧЕМУ-ТО обращается к функции только один раз (я проверял это, установкой в функции вывода строки и массива, которые в нее поступают.

В чем моя ошибка?

  Ответить  
 
 автор: Trianon   (07.01.2009 в 15:33)   письмо автору
 
   для: devil943   (07.01.2009 в 15:07)
 

if($array) return false;

по этому оператору тут же будет выполнен возврат.

Охота была писать функцию поиска, которая будет работать на порядок медленнее встроенной стандартной и на два-три порядка медленнее проверки существования ключа в массиве.

  Ответить  
 
 автор: devil943   (07.01.2009 в 15:36)   письмо автору
 
   для: Trianon   (07.01.2009 в 15:33)
 

Чесно говоря я написал ее только потому, что со стандартным array_search у меня постоянные проблемы, мне еще ни разу не удалось ее нормально попользовать :)

---------------

Спасибо, все работает, хотя странно. Ведь возвращать должно, только в случае, если массив не передан.

А что, действительно сильно медленней работает? Вроде и так код минимизирован почти до нуля...

  Ответить  
 
 автор: Trianon   (07.01.2009 в 15:41)   письмо автору
 
   для: devil943   (07.01.2009 в 15:36)
 

array_search() конечно слегка побыстрее будет, но лучше сохранять элемент в ключе.

$list = array();
while($row = mysql_fetch_assoc($res))
{
    $str = $row['referer'];
//  if(!isset($list[$str])) 
        $list[$str] = 1;
}
print_r(array_keys($list));
 


проверку (по логике имеющую смысл) я убрал в комментарий, потому что в данном случае от нее быстрее не станет.

  Ответить  
 
 автор: devil943   (07.01.2009 в 15:51)   письмо автору
 
   для: Trianon   (07.01.2009 в 15:41)
 

Я наконец понял :)
У меня было if($array) return false;
А надо if(!$array) return false; :))) Отрицание забыл))

А ключи сохранять мне не нужно, потому что мне потом надо еще сделать подсчет сколько было совпадений.

  Ответить  
 
 автор: Trianon   (07.01.2009 в 16:08)   письмо автору
 
   для: devil943   (07.01.2009 в 15:51)
 

$list = array();
while($row = mysql_fetch_assoc($res))
        @$list[$row['referer']]++;
print_r($list);

тем более.


>А что, действительно сильно медленней работает? Вроде и так код минимизирован почти до нуля...

бенчмарк можете сами организовать.

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

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