Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите чайнику поиск в array

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
android
Отправлено: 01 Января, 2012 - 20:35:44
Post Id


Посетитель


Покинул форум
Сообщений всего: 335
Дата рег-ции: Сент. 2011  


Помог: 0 раз(а)




Есть array с содержимым:

PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [0] => Array
  4.         (
  5.             [id] => 0
  6.             [ids] => 1
  7.         )
  8.  
  9.     [1] => Array
  10.         (
  11.             [id] => 2
  12.             [ids] => 3
  13.         )
  14.  
  15.     [2] => Array
  16.         (
  17.             [id] => 4
  18.             [ids] => 5
  19.         )
  20.  
  21. )
  22.  


Как можно найти [id] => 2?

array_search не помогает...
 
 Top
PATCH
Отправлено: 01 Января, 2012 - 21:17:14
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 924
Дата рег-ции: Апр. 2011  


Помог: 22 раз(а)




PHP:
скопировать код в буфер обмена
  1. foreach ($massive as $key=>$value)
  2. {
  3.        foreach ($value as $keys=>$values)
  4.       {
  5.          if($keys == "id" and $values == 2)
  6.        { echo $keys."=>".$values;}
  7.       }
  8. }
  9.  

попробуй так чтоли) окончательно подправил)

(Отредактировано автором: 01 Января, 2012 - 21:21:04)

 
 Top
Саныч Модератор
Отправлено: 01 Января, 2012 - 21:27:28
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




android, я так понимаю, что вам нужно найди массив, в котором id равен указаному, верно?
PHP:
скопировать код в буфер обмена
  1. //первый параметр - id, второй - массив для поиска
  2. //если найдено - возвращает массив, нет - false
  3. function arrSearch($id, $array) {
  4.    foreach ($array as $arr) {
  5.       if (!isset($arr['id']) || $arr['id'] != $id) continue;
  6.       return $arr;
  7.    }
  8.    return false;
  9. }


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
android
Отправлено: 01 Января, 2012 - 23:23:37
Post Id


Посетитель


Покинул форум
Сообщений всего: 335
Дата рег-ции: Сент. 2011  


Помог: 0 раз(а)




Саныч спасибо, что то голову вышибло. не смог додуматься.
 
 Top
armancho7777777 Супермодератор
Отправлено: 02 Января, 2012 - 04:42:57
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Я бы эту функцию написал так:
PHP:
скопировать код в буфер обмена
  1.  
  2. function arrSearch($id, $array){
  3.  
  4.    $fanc_result = null;
  5.  
  6.    foreach ($array as $arr) {
  7.  
  8.       if ($arr['id'] == $id){
  9.               $fanc_result = $arr;
  10.               break;
  11.           }else{
  12.               $fanc_result = false;  
  13.           }
  14.    }
  15.    
  16. return $fanc_result;
  17.    
  18. }
  19.  


Т.е. использовать "break", а не "continue", чтобы не проходить цикл дальше, а оборвать его при совпадении.

(Отредактировано автором: 02 Января, 2012 - 04:48:37)

 
 Top
Саныч Модератор
Отправлено: 02 Января, 2012 - 15:14:04
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




armancho7777777, по сути ничего не изменилось, кроме как + одна лишняя переменная и больше кода...

armancho7777777 пишет:
Т.е. использовать "break", а не "continue", чтобы не проходить цикл дальше, а оборвать его при совпадении.

он и так не будет идти дальше. Посмотрите на вот эту строку:
PHP:
скопировать код в буфер обмена
  1. if (!isset($arr['id']) || $arr['id'] != $id) continue;
Дальше мы идем, если нет нужного ключа или значение не равно. Если условие не выполниться, т.е. ключ существует и значение равно нужному, то идем дальше Собственно эта строка по сути и break, и return... Все в одном флаконе


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
armancho7777777 Супермодератор
Отправлено: 02 Января, 2012 - 16:03:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Саныч пишет:
Посмотрите на вот эту строку:
Конечноже я посмотрел эту строку))
Суть в том, что условия работают на протяжении всего цикла. То есть условие проверяет совпадения на протяжении всего цикла, число интераций которого равен количеству вложенных массивов, в отличии от break, который выводит из цикла сразу же при совпадении. А значит и скорость рабаты кода разная.
 
 Top
Саныч Модератор
Отправлено: 02 Января, 2012 - 16:18:53
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




armancho7777777, это да, но как только дело дойдет до return $arr; все и закончиться. Цикл прерывается и возвращается результат.

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


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Самогонщик
Отправлено: 02 Января, 2012 - 16:22:34
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


Помог: 8 раз(а)




armancho7777777 пишет:
Суть в том, что условия работают на протяжении всего цикла. То есть условие проверяет совпадения на протяжении всего цикла, число интераций которого равен количеству вложенных массивов, в отличии от break, который выводит из цикла сразу же при совпадении. А значит и скорость рабаты кода разная.
Всё правильно у Саныча написано, цикл остановится при первом же совпадении. У него нет временной переменной в отличие от вашего кода.

Только я бы написал так
PHP:
скопировать код в буфер обмена
  1. function arrSearch($id, $array) {
  2.    foreach ($array as $arr) {
  3.       if ($arr['id'] == $id)
  4.         return $arr;
  5.    }
  6.    return false;
  7. }
можно ещё использовать === для сравнения, но это уже пусть решает автор темы
 
 Top
Саныч Модератор
Отправлено: 02 Января, 2012 - 16:29:34
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Самогонщик пишет:
можно ещё использовать === для сравнения, но это уже пусть решает автор темы

Сори за фтопик Буквально вчера наткнулся в коде на вот такое условие:
автор сего явно не понимал, что пишет Улыбка


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Самогонщик
Отправлено: 02 Января, 2012 - 17:45:33
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


Помог: 8 раз(а)





Саныч пишет:
автор сего явно не понимал, что пишет
Согласен. Но когда я писал "ещё использовать" я совершенно не это имел введу, но думаю меня правильно поняли.

(Отредактировано автором: 02 Января, 2012 - 18:45:51)

 
 Top
armancho7777777 Супермодератор
Отправлено: 02 Января, 2012 - 18:35:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Почитайте разницу между "break" и "continue" )))
(Добавление)
Самогонщик пишет:
Всё правильно у Саныча написано, цикл остановится при первом же совпадении
Да не остановит он, а перейдет к следующей интерации дальше сравнивать.
(Добавление)
Конструкция continue так же, как и break, работает только "в паре" с циклическими конструкциями. Она немедленно завершает текущую итерацию цикла и переходит к новой
http://php.su/learnphp/cs/?cycles
 
 Top
Самогонщик
Отправлено: 02 Января, 2012 - 18:44:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


Помог: 8 раз(а)




Как говорила Алиса: "чем дальше тем страньше и страньше".

PHP:
скопировать код в буфер обмена
  1.       if (!isset($arr['id']) || $arr['id'] != $id) continue;
  2.       return $arr;


Скажи, ты согласен, что если условие ифа будет фальш, то выполнится "return $arr;", если согласен, то что произойдёт при выполнении команды return?
 
 Top
armancho7777777 Супермодератор
Отправлено: 02 Января, 2012 - 18:48:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




РАзговор не о том, что вернёт функция.
Она и при таком раскладе :

PHP:
скопировать код в буфер обмена
  1.  
  2. if (!isset($arr['id']) || $arr['id'] != $id){
  3.  
  4.       return $arr;
  5.  
  6. }
  7.  


Вернёт то что надо.
 
 Top
Самогонщик
Отправлено: 02 Января, 2012 - 18:52:12
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


Помог: 8 раз(а)




если значение по ид в массиве не существует или значение по ид не равно нужному числу (ид), то вернуть этот массив. Ты уверен, что он "Вернёт то что надо."?
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB