За последние 24 часа нас посетили 22865 программистов и 1234 робота. Сейчас ищут 800 программистов ...

Удалить из массива массив данных

Тема в разделе "PHP для новичков", создана пользователем Михаил77, 26 окт 2019.

  1. Михаил77

    Михаил77 Активный пользователь

    С нами с:
    16 окт 2019
    Сообщения:
    31
    Симпатии:
    0
    Добрый день!

    Есть массив уникальных данных 1

    PHP:
    1. <?
    2. $arrayOne = array (
    3. array ( ["DATE"] => 01.02.2010, ["VALUE"] => 200 ) ,
    4. array ( ["DATE"] => 01.02.2011 , ["VALUE"] => 500 ) ,
    5. array ( ["DATE"] => 01.02.2012, ["VALUE"] => 800 ) ,
    6. );
    7. ?>
    и массив не уникальных данных 2

    PHP:
    1. <?
    2. $arrayOne = array (
    3. array ( ["DATE"] => 01.02.2010, ["VALUE"] => 230 ) ,
    4. array ( ["DATE"]=> 01.03.2010, ["VALUE"] => 400 ) ,
    5. array ( ["DATE"] => 01.02.2011 , ["VALUE"] => 90 ) ,
    6. array ( ["DATE"] => 01.02.2010, ["VALUE"] => 700 ) ,
    7. array ( ["DATE"] => 01.02.2011, ["VALUE"] => 800 ) ,
    8. array ( ["DATE"] => 01.02.2010, ["VALUE"] => 900 ) ,
    9. array ( ["DATE"] => 01.02.2011 , ["VALUE"] => 56 ) ,
    10. array ( ["DATE"] => 01.02.2010, ["VALUE"] => 567 ) ,
    11. array ( ["DATE"] => 01.02.2011, ["VALUE"] => 578 ) ,
    12. array ( ["DATE"] => 01.07.2010, ["VALUE"] => 48 ) ,
    13. );
    14. ?>
    Как во 2-м массиве найти все данные из 1-го массива по дате "DATE" и удалить их из 2-го массива
    В результате должны получить

    PHP:
    1. <?
    2. $array = array (
    3. array ( ["DATE"]=> 01.03.2010, ["VALUE"] => 400 ) ,
    4. array ( ["DATE"] => 01.07.2010, ["VALUE"] => 48 ) ,
    5. );
    6. ?>
    Заранее благодарю!
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
  3. Михаил77

    Михаил77 Активный пользователь

    С нами с:
    16 окт 2019
    Сообщения:
    31
    Симпатии:
    0
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    покажи
     
  5. Михаил77

    Михаил77 Активный пользователь

    С нами с:
    16 окт 2019
    Сообщения:
    31
    Симпатии:
    0
    Не могу справиться с array-udiff
    Столько вариантов просмотрел в сети, не могу понять как работает функция
    Свои неудачно проделанные варианты даже стесняюсь выкладывать
    Есть у кого нибудь готовые решения?
    Как из многомерного массива удалить значение другого многомерного массива
     
  6. onderbert

    onderbert Новичок

    С нами с:
    24 мар 2019
    Сообщения:
    18
    Симпатии:
    1
    Дак в чем проблема? Пройдись по нему цыклом, поставь условие и если оно не истенно пропускай итерацию. Там где истинно записывай данные в новый массив.
     
  7. Михаил77

    Михаил77 Активный пользователь

    С нами с:
    16 окт 2019
    Сообщения:
    31
    Симпатии:
    0
    В итоге не справился : (
     
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    @Михаил77 сначала немного офтопика: не используй короткий тег <? . С ним ты обязательно сядешь в лужу на каком-нибудь новом хостинге. И не надо ставить закрывающий ?> в последней строке. Эту практику признали ненужной и даже опасной. Это официальная рекомендация.

    Теперь по теме:
    Эти массивы пришли из базы ? Просто средствами SQL подобные задачи решаются как 2*2. Когда соединяешь две таблицы, в результате получаешь только связанные данные.
     
  9. Михаил77

    Михаил77 Активный пользователь

    С нами с:
    16 окт 2019
    Сообщения:
    31
    Симпатии:
    0
    Доброе утро!

    Массивы сформированы из XML документа
     
  10. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    PHP:
    1. <?php
    2. $arrayOne = array (
    3.     array ( "DATE" => "01.02.2010", "VALUE" => 200 ) ,
    4.     array ( "DATE" => "01.02.2011" , "VALUE" => 500 ) ,
    5.     array ( "DATE" => "01.02.2012", "VALUE" => 800 ) ,
    6. );
    7. $arrayTwo = array (
    8.     array (  "DATE"  =>"01.02.2010",  "VALUE"  => 230 ) ,
    9.     array (  "DATE" =>"01.03.2010",  "VALUE"  => 400 ) ,
    10.     array (  "DATE"  =>"01.02.2011" , "VALUE"  => 90 ) ,
    11.     array (  "DATE"  =>"01.02.2010",  "VALUE"  => 700 ) ,
    12.     array (  "DATE"  =>"01.02.2011",  "VALUE"  => 800 ) ,
    13.     array (  "DATE"  =>"01.02.2010",  "VALUE"  => 900 ) ,
    14.     array (  "DATE"  =>"01.02.2011",  "VALUE"  => 56 ) ,
    15.     array (  "DATE"  =>"01.02.2010",  "VALUE"  => 567 ) ,
    16.     array (  "DATE"  =>"01.02.2011",  "VALUE"  => 578 ) ,
    17.     array (  "DATE"  =>"01.07.2010",  "VALUE"  => 48 ) ,
    18. );
    19.  
    20. $array = array();
    21.  
    22. foreach($arrayTwo as $value)
    23. {
    24.     $key = array_search($value['DATE'], array_column($arrayOne, 'DATE'));
    25.  
    26.     if($key === false)
    27.     {
    28.         $array[] =  $value ;
    29.     }
    30. }
    31.  
    32. print_r($array);
     
  11. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям

    Ясно. Я бы, тем не менее, загрузил их в базу и уже в ней работал с множествами. Тем более, что MySQL имеет встроенные средства для быстрого импорта огромных XML.
    --- Добавлено ---
    @Artur_hopf годно. Надо только array_column() вынести из цикла. И тогда вообще напрашивается убрать цикл, делать всё на встроенных функциях.

    PHP:
    1. $dateColumn = array_column($arrayOne, 'DATE');
    2. $result = array_filter($arrayTwo, function ($item) use ($dateColumn) {
    3.   return array_search($item['DATE'], $dateColumn) === false;
    4. });
    --- Добавлено ---
    На SQL это бы выглядело так (один из вариантов):
    Код (SQL):
    1. SELECT *
    2. FROM table2
    3. WHERE NOT EXISTS(
    4.     SELECT 1
    5.     FROM table1
    6.     WHERE table1.`date` = table2.`date`
    7. )
    или
    Код (SQL):
    1. SELECT table2.*
    2. FROM table2
    3. LEFT JOIN table1 USING(`date`)
    4. WHERE table1.id IS NULL
     
  12. Михаил77

    Михаил77 Активный пользователь

    С нами с:
    16 окт 2019
    Сообщения:
    31
    Симпатии:
    0

    Отлично!!!!
    Благодарю Вас! очень выручили, то что нужно было!!!
     
  13. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    PHP:
    1. <?php
    2.  
    3. $array1 = [
    4.     [ "DATE" => '01.02.2010', "VALUE" => 200 ],
    5.     [ "DATE" => '01.02.2011' , "VALUE" => 500 ],
    6.     [ "DATE" => '01.02.2012', "VALUE" => 800 ],
    7. ];
    8.  
    9. $array2 = [
    10.     [ "DATE" => '01.02.2011' , "VALUE" => 56 ],
    11.     [ "DATE" => '01.02.2010', "VALUE" => 230 ],
    12.     [ "DATE"=> '01.03.2010', "VALUE" => 400 ],
    13.     [ "DATE" => '01.02.2011' , "VALUE" => 90 ],
    14.     [ "DATE" => '01.02.2010', "VALUE" => 700 ],
    15.     [ "DATE" => '01.02.2011', "VALUE" => 800 ],
    16.     [ "DATE" => '01.02.2010', "VALUE" => 900 ],
    17.     [ "DATE" => '01.02.2010', "VALUE" => 567 ],
    18.     [ "DATE" => '01.02.2011', "VALUE" => 578 ],
    19.     [ "DATE" => '01.07.2010', "VALUE" => 48 ],
    20. ];
    21.  
    22. $result = array_udiff ( $array2, $array1, fn ( $a, $b ) => strcmp ( $a['DATE'], $b['DATE'] ) );
    23.  
    24. print_r ( $result );
    PHP:
    1. (
    2.     [2] => Array
    3.         (
    4.             [DATE] => 01.03.2010
    5.             [VALUE] => 400
    6.         )
    7.  
    8.     [9] => Array
    9.         (
    10.             [DATE] => 01.07.2010
    11.             [VALUE] => 48
    12.         )
    13.  
    14. )