Как проверить наличие элемента в двумерном массиве?

Статус
В этой теме нельзя размещать новые ответы.

mnmlist

Новичок
Есть текстовый файл, в нем так:
[email protected]|11111111
abc@aaferu|11111111
[email protected]|11111111
[email protected]|11111111
[email protected]|111222
[email protected]|111222

Считываю в двумерный массив разбив по переносу строки и |

PHP:
function FileRead() {
   $file = "db.txt";
   if (!file_exists($file)) return array();
   $pb=array();
   $fp=@file($file);
   foreach($fp as $line) {
      $pb[]=explode("|", $line);
   }
   return $pb;
}

Далее задача - узнать есть ли емайл в массиве и если есть, то выдать его пароль, но у меня array_search всегда какбудто не находит.

PHP:
if (array_search("[email protected]", FileRead())===FALSE){
echo "Ящик не существует";
} else{
echo "Ящик существует";
}
 

С.

Продвинутый новичок
В PHP нет двумерных массивов. Есть вложенные массивы. С этой точки зрения поставьте себя на место array_search() и посмотрите на свой массив ее [одномерными] глазами.
 

craz

Нестандартное звание
В PHP нет двумерных массивов. Есть вложенные массивы. С этой точки зрения поставьте себя на место array_search() и посмотрите на свой массив ее [одномерными] глазами.

а еще можете переписать

foreach($fp as $line) {
$pb[]=explode("|", $line);
}
на
foreach($fp as $line) {
$tmp = explode("|", $line);
$pb[$tmp[0]]=$tmp[1];
}

получите ключи это ваши емайлы а значения это ваши цифирки и можно будет array_key_exists и in_array юзать - хотя я вот не в курсе насколько это лучше...
 

newARTix

Новичок
вот кстати, почти всегда юзаю isset($arr[$key]) вместо array_key_exists(). И все время меня мучает ощущение что я что-то делаю не так. Кроме того что isset не понимает null значения, какие-то еще проблемы могут быть?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Вурдалак почему isset правильней, чем array_key_exists?
 

Вурдалак

Продвинутый новичок
Я до сих пор по некоторым впечатлением от C#: мне кажется гораздо более удобным, чтобы $arr['doesNotExist'] не выбрасывал E_NOTICE, а спокойно возвращал NULL, и само понятие «существование ключа» отпало бы за ненадобностью. Это бы сократило кучу лишних проверок существования значения вроде
PHP:
$value = isset($arr[$key]) ? $arr[$key] : NULL;
Можно было бы использовать сразу $arr[$key]. И действительно: я не могу придумать ситуации, в которой логика программы должна была бы основываться от присутствия какого-то ключа, а не значения. Нет значения — нафига нам ключ? Отсюда, по моим рассуждениям, array_key_exists() в нормальном коде вообще не должна присутствовать.

У PHP есть ряд особенностей, которые не позволяют, конечно, так просто перейти к такой фишке.

Да и потом, isset() позволяет проверять сразу целый «путь»: isset($arr[$a][$b][$c]).

Аргумент про то, что с array_key_exists() случайно не подсунешь строку тоже вялый, т.к. Type Hinting спасёт.

P.S. Под «ключом» в данном контексте следует понимать текстовый ключ, а не индекс.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Вурдалак для такого поведения я использую свой ArrayObject, который возвращает null
this talk is cheap
 

jonjonson

Охренеть
Вурдалак, как бы немного не соглашусь. Бывает нужно, что бы ключ определялся заранее без значения. Простой пример этого явления без массива:
PHP:
function foo()
{
    static $key;

    if (is_null($key)) {
        // init $key...
    } else {
        // use $key...
    }
}
 

Вурдалак

Продвинутый новичок
grigori, ты молодец. А что у тебя возвращает isset($arrObj['a']), если там NULL?

jonjonson, с чем ты не соглашаешься?
 

jonjonson

Охренеть
Вурдалак, а почему я не могу использовать массив? И мало того, почему не могу инициализировать значение его ключей в зависимости от контекста?
 

jonjonson

Охренеть
Кстати, а чем лучше isset($array['key']) лучше чем is_null($array['key'])?
Второе более логично.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху