Проверка наличия ключа: как быстрее

young

Новичок
Проверка наличия ключа: как быстрее

Требуется составить массив чисел (к примеру IDшников строк из базы) а потом проверять наличие конкретного значения в этой структуре.

Вариант 1
$array[$key] = true, если он нас интересует
Имеем одномерный хеш-массив
Проверка
if ($array[$need])

Вариант 2
$array = ($key1, $key2, ...);
Проверка
if (in_array($need, $array))

Какой из них более логичен и корректен?
PS: И по идее какой должен быть быстрее, ибо на практике разницы во времени практически нет
 

Апокалипсис

Guest
Вариант
PHP:
include ("_dima_timestat.php");
 
    timestart("test");
 $a = array(1,1,1,1,1,1,1,1,11,1,54,4,5,45,45,45,78,87,545,45454,54545,45454,
 45,444,444,4444,777,777,888,88);

 if (in_array("444", $a))
 {
 
 }

 timeprint();
работает 0.0150 сек

А если использовать if($a[$need]) то - 0.0012 сек
 

netdog

net @
это не показатель
1. массив маленький
2. всего один тест

ИМХО in_array должен работать на порядок быстрее ...
 

netdog

net @
Кстати, young ... И Апокалипсис...

То ли я торможу один, то ли вы сразу вдвоем тормозите...

if ($array[$need])
и
if (in_array($need, $array))

это совершенно разные вещи... Выполняющие разные функции...
 

rembo

Новичок
Интересно, хоть это и полнейший изврат, но факт от что если $key строки а массив ассоциативный то первый вариант обходит in_array в неколько раз
 

netdog

net @
мне плохо, чуваки... я наверное дурак ;)


$array = array ('a','b','c','d','e','f','0');
$need = 'f';

if ( in_array($need ,$array)); // ясное дело true ибо в массиве есть $need

второй вариант:

if ($array['$need']) // ясное дело тут никак не может быть true... Ибо ключи массива 0,1,2,3,4,5,6!!!!!!

И ЧЕ С ЭТОГО ВЫЙДЕТ? А? Эта конструкция ключ будет искать а не значение ключа мазафака..

Или я просто чего-то не понимаю???? Просветите, а ? Кто из нас, что, путает ...??????? ;)
 

rembo

Новичок
Имелось ввиду что-то вроде этого

$array = array('c' => true);

$need = 'c';

if ($array['$need']) // результат true
 

netdog

net @
Ну я так и подумал...
тока лажа получится если вдруг ключи окажутся одинаковыми... хотя если id то не должно..
 

young

Новичок
мне плохо, чуваки... я наверное дурак
Я так вижу, тебе уже обхяснили, там разыне структуры данных:

В первом примере:
var = array(
key1 => true,
key2 => true
)

Во втором
var = array(key1, key2);

что если $key строки
А если int, но из диапазона ~10^3 - ~10^6
 

Larson

Новичок
ИМХО лучше использовать in_array, т.к. в другом варианте будет выскакивать ошибка, при отсутствии ключа в массиве.
 

Larson

Новичок
А теперь берем оба варианта
PHP:
if (isset($array[$need]))

if (in_array($need, $array))
Какой более понятный, такой и выбираем.
А на счет скорости - возми да сам померей.
 

Larson

Новичок
Хотя мне кажется, что все равно будет ругаться на несуществующий ключ. Надо юзать [m]array_key_exists[/m].
 

Verk

Guest
Если ты набил большой массив

PHP:
$arr[]=234;
......
и часто его используешь не меняя

сделай так

PHP:
$arr = array_flip($arr);
после полной укомплектации массива и осуществляй проверку на наличие в нем элеманта (скажем, $var) так :

PHP:
if (isset($arr[$var])) {
     echo 'true';
}
else    {
     echo 'false';
}
иначе используй in_array()
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Larson
Хотя мне кажется, что все равно будет ругаться на несуществующий ключ. Надо юзать [m]array_key_exists[/m].
array_key_exists надо юзать по другой причине, код:
PHP:
$ary = array(
    'a' => null
);
echo isset($ary['a'])? 'yes, ': 'no, ';
echo array_key_exists('a', $ary)? 'yes': 'no';
напечатает 'no, yes'.
 

Demiurg

Guest
что то я не понял, какие массивы ?
select count(*) from table where id = $id
 

Verk

Guest
Он просто не хочет этот запрос мульён раз делать, а выбрать id-шники в массив и проверять там.
 
Сверху