|
|
|
| Вот функция, котороя работает по типу 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'] все строки должны быть разными.
Но проблема в том, что программа ПОЧЕМУ-ТО обращается к функции только один раз (я проверял это, установкой в функции вывода строки и массива, которые в нее поступают.
В чем моя ошибка? | |
|
|
|
|
|
|
|
для: devil943
(07.01.2009 в 15:07)
| | if($array) return false;
по этому оператору тут же будет выполнен возврат.
Охота была писать функцию поиска, которая будет работать на порядок медленнее встроенной стандартной и на два-три порядка медленнее проверки существования ключа в массиве. | |
|
|
|
|
|
|
|
для: Trianon
(07.01.2009 в 15:33)
| | Чесно говоря я написал ее только потому, что со стандартным array_search у меня постоянные проблемы, мне еще ни разу не удалось ее нормально попользовать :)
---------------
Спасибо, все работает, хотя странно. Ведь возвращать должно, только в случае, если массив не передан.
А что, действительно сильно медленней работает? Вроде и так код минимизирован почти до нуля... | |
|
|
|
|
|
|
|
для: 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));
|
проверку (по логике имеющую смысл) я убрал в комментарий, потому что в данном случае от нее быстрее не станет. | |
|
|
|
|
|
|
|
для: Trianon
(07.01.2009 в 15:41)
| | Я наконец понял :)
У меня было if($array) return false;
А надо if(!$array) return false; :))) Отрицание забыл))
А ключи сохранять мне не нужно, потому что мне потом надо еще сделать подсчет сколько было совпадений. | |
|
|
|
|
|
|
|
для: devil943
(07.01.2009 в 15:51)
| |
$list = array();
while($row = mysql_fetch_assoc($res))
@$list[$row['referer']]++;
print_r($list);
|
тем более.
>А что, действительно сильно медленней работает? Вроде и так код минимизирован почти до нуля...
бенчмарк можете сами организовать. | |
|
|
|