Добрый день! Есть массив уникальных данных 1 PHP: <? $arrayOne = array ( array ( ["DATE"] => 01.02.2010, ["VALUE"] => 200 ) , array ( ["DATE"] => 01.02.2011 , ["VALUE"] => 500 ) , array ( ["DATE"] => 01.02.2012, ["VALUE"] => 800 ) , ); ?> и массив не уникальных данных 2 PHP: <? $arrayOne = array ( array ( ["DATE"] => 01.02.2010, ["VALUE"] => 230 ) , array ( ["DATE"]=> 01.03.2010, ["VALUE"] => 400 ) , array ( ["DATE"] => 01.02.2011 , ["VALUE"] => 90 ) , array ( ["DATE"] => 01.02.2010, ["VALUE"] => 700 ) , array ( ["DATE"] => 01.02.2011, ["VALUE"] => 800 ) , array ( ["DATE"] => 01.02.2010, ["VALUE"] => 900 ) , array ( ["DATE"] => 01.02.2011 , ["VALUE"] => 56 ) , array ( ["DATE"] => 01.02.2010, ["VALUE"] => 567 ) , array ( ["DATE"] => 01.02.2011, ["VALUE"] => 578 ) , array ( ["DATE"] => 01.07.2010, ["VALUE"] => 48 ) , ); ?> Как во 2-м массиве найти все данные из 1-го массива по дате "DATE" и удалить их из 2-го массива В результате должны получить PHP: <? $array = array ( array ( ["DATE"]=> 01.03.2010, ["VALUE"] => 400 ) , array ( ["DATE"] => 01.07.2010, ["VALUE"] => 48 ) , ); ?> Заранее благодарю!
Не могу справиться с array-udiff Столько вариантов просмотрел в сети, не могу понять как работает функция Свои неудачно проделанные варианты даже стесняюсь выкладывать Есть у кого нибудь готовые решения? Как из многомерного массива удалить значение другого многомерного массива
Дак в чем проблема? Пройдись по нему цыклом, поставь условие и если оно не истенно пропускай итерацию. Там где истинно записывай данные в новый массив.
@Михаил77 сначала немного офтопика: не используй короткий тег <? . С ним ты обязательно сядешь в лужу на каком-нибудь новом хостинге. И не надо ставить закрывающий ?> в последней строке. Эту практику признали ненужной и даже опасной. Это официальная рекомендация. Теперь по теме: Эти массивы пришли из базы ? Просто средствами SQL подобные задачи решаются как 2*2. Когда соединяешь две таблицы, в результате получаешь только связанные данные.
PHP: <?php $arrayOne = array ( array ( "DATE" => "01.02.2010", "VALUE" => 200 ) , array ( "DATE" => "01.02.2011" , "VALUE" => 500 ) , array ( "DATE" => "01.02.2012", "VALUE" => 800 ) , ); $arrayTwo = array ( array ( "DATE" =>"01.02.2010", "VALUE" => 230 ) , array ( "DATE" =>"01.03.2010", "VALUE" => 400 ) , array ( "DATE" =>"01.02.2011" , "VALUE" => 90 ) , array ( "DATE" =>"01.02.2010", "VALUE" => 700 ) , array ( "DATE" =>"01.02.2011", "VALUE" => 800 ) , array ( "DATE" =>"01.02.2010", "VALUE" => 900 ) , array ( "DATE" =>"01.02.2011", "VALUE" => 56 ) , array ( "DATE" =>"01.02.2010", "VALUE" => 567 ) , array ( "DATE" =>"01.02.2011", "VALUE" => 578 ) , array ( "DATE" =>"01.07.2010", "VALUE" => 48 ) , ); $array = array(); foreach($arrayTwo as $value) { $key = array_search($value['DATE'], array_column($arrayOne, 'DATE')); if($key === false) { $array[] = $value ; } } print_r($array);
Ясно. Я бы, тем не менее, загрузил их в базу и уже в ней работал с множествами. Тем более, что MySQL имеет встроенные средства для быстрого импорта огромных XML. --- Добавлено --- @Artur_hopf годно. Надо только array_column() вынести из цикла. И тогда вообще напрашивается убрать цикл, делать всё на встроенных функциях. PHP: $dateColumn = array_column($arrayOne, 'DATE'); $result = array_filter($arrayTwo, function ($item) use ($dateColumn) { return array_search($item['DATE'], $dateColumn) === false; }); --- Добавлено --- На SQL это бы выглядело так (один из вариантов): Код (SQL): SELECT * FROM table2 WHERE NOT EXISTS( SELECT 1 FROM table1 WHERE table1.`date` = table2.`date` ) или Код (SQL): SELECT table2.* FROM table2 LEFT JOIN table1 USING(`date`) WHERE table1.id IS NULL
PHP: <?php $array1 = [ [ "DATE" => '01.02.2010', "VALUE" => 200 ], [ "DATE" => '01.02.2011' , "VALUE" => 500 ], [ "DATE" => '01.02.2012', "VALUE" => 800 ], ]; $array2 = [ [ "DATE" => '01.02.2011' , "VALUE" => 56 ], [ "DATE" => '01.02.2010', "VALUE" => 230 ], [ "DATE"=> '01.03.2010', "VALUE" => 400 ], [ "DATE" => '01.02.2011' , "VALUE" => 90 ], [ "DATE" => '01.02.2010', "VALUE" => 700 ], [ "DATE" => '01.02.2011', "VALUE" => 800 ], [ "DATE" => '01.02.2010', "VALUE" => 900 ], [ "DATE" => '01.02.2010', "VALUE" => 567 ], [ "DATE" => '01.02.2011', "VALUE" => 578 ], [ "DATE" => '01.07.2010', "VALUE" => 48 ], ]; $result = array_udiff ( $array2, $array1, fn ( $a, $b ) => strcmp ( $a['DATE'], $b['DATE'] ) ); print_r ( $result ); PHP: Array ( [2] => Array ( [DATE] => 01.03.2010 [VALUE] => 400 ) [9] => Array ( [DATE] => 01.07.2010 [VALUE] => 48 ) )