За последние 24 часа нас посетили 20599 программистов и 1124 робота. Сейчас ищут 734 программиста ...

Поиск по ключу и значению в массиве

Тема в разделе "PHP для новичков", создана пользователем Yankovitz, 7 авг 2019.

  1. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Добрый день. У меня есть массив:
    Код (Text):
    1. Array
    2. (
    3.     [0] => {"item_id":"2285","item_image":2291,"item_variation":{"kolichestvo-domenov":"1 домен", "support":"Нет"},"item_price":"1900"}
    4.     [1] => {"item_id":"2286","item_image":2292,"item_variation":{"kolichestvo-domenov":"3 домена", "support":"Да"},"item_price":"3800"}
    5.     [2] => {"item_id":"2287","item_image":2289,"item_variation":{"kolichestvo-domenov":"5 доменов", "support":"Да"},"item_price":"5500"}
    6. )
    Второй массив:
    Код (Text):
    1. Array ( [kolichestvo-domenov] => 3 домена [support] => Да [saveguard] => [post_id] => 2222 )
    Мне условно необходимо получить элемент 1 из первого массива. Выборка производится если в item_variation первого массива есть значения из второго. Последовательность и количество элементов в обоих массивах заведомо неизвестно. Буду благодарен за любую помощь.
     
  2. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    PHP:
    1. $array1 = Array
    2. (
    3.     Array( "item_id" => "2285","item_image" => 2291,"item_variation" => Array("kolichestvo-domenov" => "1 домен","support" => "Нет" ),"item_price" => "1900"),
    4.     Array("item_id" => "2286","item_image" => 2292,"item_variation" => Array("kolichestvo-domenov" => "3 домена", "support" => "Да"),"item_price" => "3800"),
    5.     Array("item_id" => "2287","item_image" => 2289,"item_variation" => Array("kolichestvo-domenov" => "5 доменов", "support" => "Да"),"item_price" => "5500")
    6. );
    7.  
    8. $array2 = Array ( "kolichestvo-domenov" => "3 домена", "support" => "Да",  "saveguard" => "",  "post_id" => 2222 );
    9.  
    10. $result = [];
    11.  
    12. foreach($array1 as $item)
    13. {
    14.     $kol = trim( $item['item_variation']['kolichestvo-domenov'] );
    15.     $sup = trim( $item['item_variation']['support'] );
    16.    
    17.     if( trim( $array2['kolichestvo-domenov'] ) === $kol  && trim( $array2['support'] ) === $sup )
    18.     {
    19.         $result[] = $item['item_id'];
    20.     }
    21. }
    22.  
    23. print_r($result);
     
  3. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    497
    Симпатии:
    57
    У первого массива элементы являются объектами.
    нужно преобразовывать в массив
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    у первого массива, элементы являются типом string в json формате
    --- Добавлено ---
    в чем проблема ?
     
  5. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    497
    Симпатии:
    57
    были бы это обычный json он был бы в кавычках.
    в данном случае это не string

    для js вполне себе объекты
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    Давай не будем друг другу голову заливать глупой информацией . Держи:
    http://sandbox.onlinephpfunctions.com/code/88959df0e15a013b522be822b080551a3f0c56b2
    нет, ты серьезно ? o_O в callable !
     
  7. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    497
    Симпатии:
    57
    MouseZver нравится это.
  8. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Спасибо, хорошее решение. Однако я забыл упомянуть ещё одно условие. Заранее неизвестны ключи.
     
  9. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    497
    Симпатии:
    57
    перепиши, попробуй в цикле прописать проверку , что то вроде:

    if ($item['item_variation'] === $array2) {
     
  10. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    497
    Симпатии:
    57
    Смотри в песочнице:
    http://sandbox.onlinephpfunctions.com/code/59afee27615a883fbd8fadb101a997f90d53fed2

    При "==" проверяется только соответствие ключей элементов массива и значения, а последовательность элементов массива не учитывается.
     
  11. Yankovitz

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

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Сделал следующим образом, вдруг кому пригодится.
    Код (Text):
    1. $array1 = Array
    2. (
    3.     Array( "item_id" => "2285","item_image" => 2291,"item_variation" => Array("kolichestvo-domenov" => "1 домен","support" => "Нет" ),"item_price" => "1900"),
    4.     Array("item_id" => "2286","item_image" => 2292,"item_variation" => Array("kolichestvo-domenov" => "3 домена", "support" => "Да",  "saveguard" => "",  "post_id" => 2222),"item_price" => "3800"),
    5.     Array("item_id" => "2287","item_image" => 2289,"item_variation" => Array("kolichestvo-domenov" => "5 доменов", "support" => "Да"),"item_price" => "5500")
    6. );
    7. $array2 = Array ( "saveguard" => "",  "post_id" => 2222, "support" => "Да", "kolichestvo-domenov" => "3 домена");
    8.  
    9. foreach ($array1 as $a) {
    10.     $arr = array_diff( $a['item_variation'], $array2 );
    11.     if ( empty( $arr ) ){
    12.         return $a;
    13.     }
    14. }
    array_diff возвратит пустой массив, если данные из $a['item_variation'] будут присутствовать в массиве $array2;