За последние 24 часа нас посетили 18865 программистов и 1710 роботов. Сейчас ищут 942 программиста ...

Поиск в многомерном ассоциативном массиве.

Тема в разделе "PHP для новичков", создана пользователем tesla, 29 фев 2016.

  1. tesla

    tesla Активный пользователь

    С нами с:
    29 фев 2016
    Сообщения:
    34
    Симпатии:
    1
    Добрый день\вечер.
    Есть массив товаров, в котором нужно найти введенный елемент по названию, делаю так:
    Код (PHP):
    1. $product[]= ['name' => 'motherboard', 'cost' => '350', 'description' => 'description of first product'];
    2. $product[]= ['name' => 'hdd', 'cost' => '250', 'description' => 'description of second product'];
    3. $product[]= ['name' => 'ssd ', 'cost' => '280', 'description' => 'description of third product'];
    4.  
    5. $search_value = 'ssd';
    6.  
    7. for($i=0; $i<sizeof($product); $i++)
    8. {
    9.     
    10.     if ($search_value === $product[$i]['name'])
    11.         {
    12.             echo "совпадение найдено";
    13.         }
    14.  
    15. }
    16.  
    В таком варианте развития событий, я не получаю вообще ничего. Подскажите пожалуйста, в чем ошибка?

    Но
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    пробел же там
     
  3. tesla

    tesla Активный пользователь

    С нами с:
    29 фев 2016
    Сообщения:
    34
    Симпатии:
    1
    я не совсем понял, где?)
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    после ссд в объявлении в массиве
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Код (PHP):
    1. 'name' => 'ssd '
    2.               ^ тут
     
  6. tesla

    tesla Активный пользователь

    С нами с:
    29 фев 2016
    Сообщения:
    34
    Симпатии:
    1
    Спасибо большое, буду внимательнее.
    Не стану все городить тут, решил задачу вот так:
    Код (PHP):
    1. for($i=0; $i<sizeof($product); $i++)
    2. {
    3.     
    4.     if ($search_value === $product[$i]['name'])
    5.         {
    6.             $index = $i;
    7.             break;
    8.         }
    9. }
    10.  
    11. echo $product[$index]['name'].'<br />';
    12. echo $product[$index]['cost'].'<br />';
    13. echo $product[$index]['description'];
    Пример простой, но может быть есть более элегантные решения? Не прошу показывать, просто подскажите на что можно обратить внимание.
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    foreach проще писать, ещё можно возвращать не индекс, а целиком всю найденную штучку, и с ней дальше работать. Но когда как.
     
  8. tesla

    tesla Активный пользователь

    С нами с:
    29 фев 2016
    Сообщения:
    34
    Симпатии:
    1
    Через foreach казалось бы проще, но не осилил)
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Код (PHP):
    1. foreach ($product as $p) {
    2.     if ($search_value === $p['name']) {
    3.             $index = $i;
    4.             break;
    5.         }
    6. }
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Игорь, наверное тогда
    Код (PHP):
    1. foreach ($product as $i => $p) {
    У тебя опечатка по ходу, а люди такие вещи не понимают, по опыту. Я как-то запятую пропустил в коде в ответе, так мне чел с претензией: "не работает, ошибку кидает" :)))
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а, да. я не запускал, на форуме писал, болтая с кем-то =) да. косяк. не заработало бы, озадачился бы чел, однозначно. Спасибо.
     
  12. tesla

    tesla Активный пользователь

    С нами с:
    29 фев 2016
    Сообщения:
    34
    Симпатии:
    1
    Сделал с foreach, все работает. Хотел вот сделать возможность поиска и по desription
    Код (PHP):
    1. $product[] = ['name' => 'ssd', 'price' => '180', 'description' => 'description of third product'];
    2.  
    3. $s = 'third'; \\ любая часть текста из description
    4.  
    5. foreach ($product as $key => $value)
    6.     {
    7.         var_dump(strpos($s, $value['description']));
    8.     } 
    Получаю false =\
    Логика какова - брать введенное в поле и сравнивать с описанием. В strpos $value['description'] является строкой в данном примере, не могу понять почему не отрабатывает =\
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    потому что строки "дескрипшн оф фёрд продукт" нет в строке "фёрд". открой мануал и прочитай внимательно сигнатуру функции strpos
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    У strpos другой порядок аргументов. В php-е за этим надо следить. Библиотечные функции писали разные люди, поэтому порядок аргументов у них - как кому нравится. У некоторых сначала $needly, а потом $haystack, у некоторых наоборот. Хорошая IDE с подсказками в этом тебе поможет. Ну и https://php.net/strpos