Как сравнить массивы PHP правильно?

184
04 апреля 2018, 08:38

Есть много массивов типа:

Array ( 
[0] => 12512650 
[1] => https://www.makfsa.ru/ 
[2] => https://ru.wikipsedia.org/wiki/%D0%9C%D0%B0%D0%BA%D1%84%D0%B0 
[3] => http://makfa.nichosst.ru/ 
[4] => http://ru.makfapasta.com/production/product/pasta/ 
[5] => http://ru.makfapasta.com/ 
[6] => https://www.utkaonos.ru/item/42/1096519 
[7] => https://www.utkonos.ru/item/42/1096522 
[8] => https://www.utkonos.ru/item/1381/3223485 
[9] => https://www.uatkonos.ru/item/42/1096527 
[10] => https://proactions.ru/actions/food/makfa/ 
)

Таких массивов может быть от 2х до 20и.

Есть так же массив типа:

Array ( 
[obj] => 
   Array ( 
   [0] => 
      Array ( 
       [url] => https://www.utkonos.ru/item/1381/3223485 
       [ton] => Не определена 
       [type] => Не определен 
       ) 
   [1] => 
      Array ( 
       [url] => https://proactions.ru/actions/food/makfa/ 
       [ton] => Не определена 
       [type] => Не определен 
      ) 
   [2] => Array ( 
       [url] => http://makfa.nichost.ru/ 
       [ton] => Не определена 
       [type] => Не определен 
      ) 
   [3] => Array ( 
       [url] => https://ru.wikipedia.org/wikif/%D0%9C%D0%B0%D0%BA%D1%84%D0%B0 
       [ton] => Не определена 
       [type] => Не определен 
      ) 
   [4] => Array ( 
       [url] => http://ru.makfapasta.com/producftion/product/pasta/
       [ton] => Не определена
       [type] => Не определен ) 
   [5] => Array ( 
       [url] => http://ru.mafkfapasta.com/ 
       [ton] => Не определена 
       [type] => Не определен 
    ) ....

Необходимо url из второго массива сравнить с с первыми массивами и образовать новые массива типа первых, но уже с добавлением соответствующих ton и type значений. Как?

Answer 1

Ваши массивы:

$arr_1 = [
    '12512650',
    'https://www.makfsa.ru/',
    'https://ru.wikipsedia.org/wiki/%D0%9C%D0%B0%D0%BA%D1%84%D0%B0',
    'http://makfa.nichosst.ru/',
    'http://ru.makfapasta.com/production/product/pasta/',
    'http://ru.makfapasta.com/',
    'https://www.utkaonos.ru/item/42/1096519',
    'https://www.utkonos.ru/item/42/1096522',
    'https://www.utkonos.ru/item/1381/3223485',
    'https://www.uatkonos.ru/item/42/1096527',
    'https://proactions.ru/actions/food/makfa/'
];
$arr_2 = [
    'obj' =>  [
        [
           'url' => 'https://www.utkonos.ru/item/1381/3223485',
           'ton' => 'Не определена',
           'type' => 'Не определен'
        ],
        [
           'url' => 'https://proactions.ru/actions/food/makfa/',
           'ton' => 'Не определена',
           'type' => 'Не определен'
        ],
        [
           'url' => 'http://makfa.nichost.ru/',
           'ton' => 'Не определена',
           'type' => 'Не определен'
        ],
        [
           'url' => 'https://ru.wikipedia.org/wikif/%D0%9C%D0%B0%D0%BA%D1%84%D0%B0',
           'ton' => 'Не определена',
           'type' => 'Не определен'
        ],
        [
           'url' => 'http://ru.makfapasta.com/producftion/product/pasta/',
           'ton' => 'Не определена',
           'type' => 'Не определен'
        ],
        [
           'url' => 'http://ru.mafkfapasta.com/',
           'ton' => 'Не определена',
           'type' => 'Не определен'
        ]
    ]
];

Тогда решение можно записать так:

$new = [];
foreach($arr_2 as $key => $arr) {
    foreach ($arr as $k => $a) {
        $url = array_intersect(array_column($arr_2[$key], 'url'), $arr_1);
        ! in_array($a['url'], $url) ?: $new[] = $a;
    }
}
var_dump($new);

В результате работы скрипта будет получен массив:

array (size=2)
  0 => 
    array (size=3)
      'url' => string 'https://www.utkonos.ru/item/1381/3223485' (length=40)
      'ton' => string 'Не определена' (length=25)
      'type' => string 'Не определен' (length=23)
  1 => 
    array (size=3)
      'url' => string 'https://proactions.ru/actions/food/makfa/' (length=41)
      'ton' => string 'Не определена' (length=25)
      'type' => string 'Не определен' (length=23)
Answer 2

Примерно так:

<?php
$first_array = array( '......' );
$last_array = array( '......' );
$result = array();
for ( $i = 0; $i < count( $first_array ); $i++ ) {
    $key = array_search( $first_array[ $i ], $last_array, true );
    if ( $key ) {
        $result[ $i ][ 'url' ] = $last_array[ $key ][ 'url' ];
        $result[ $i ][ 'url' ] = $last_array[ $key ][ 'ton' ];
        $result[ $i ][ 'url' ] = $last_array[ $key ][ 'type' ];
    }
}
print_r( $result );

?>

p.s Не забудьте подменить ваши массивы на мои ($first_array,$last_array)

READ ALSO
Если значение пусто то берем прошлое

Если значение пусто то берем прошлое

Как реализовать что-бы при цикли если значение пустое нужно взять его из прошлого раза

188
TCPclient таймаут соединения

TCPclient таймаут соединения

Как на стороне сервера можно обработать таймаут клиентов, когда тот "тихо" вырубается? На стороне клиента решил эту проблему, если сервер...

233
Некорректное отображение DataGridView

Некорректное отображение DataGridView

Создала приложение которое добавляет строчки в DataGridView по событиям одновременно задается раскраска

247
Как установить AvalonDock?

Как установить AvalonDock?

Пытаюсь прикрепить AvalonDock к проектуТам архив в котором архив с source code, как собрать и использовать в WPF проекте?

208