2016-04-29 3 views
-1

У меня есть два разных массива. Массив, какphp многомерный массив значение ключа поиск из двух разных массивов

первый массив как

Array 
(
    [0] => Array 
     (
      [source_language] => English 
      [target_language] => Array 
       (
        [0] => German 
        [1] => Norwegian 
       ) 

      [title] => file 1.xlsx 
      [file_name] => 1461911750_file_test.xlsx 
     ) 

    [1] => Array 
     (
      [source_language] => Hindi 
      [target_language] => Array 
       (
        [0] => Belarusian 
       ) 

      [title] => new files.xlsx 
      [file_name] => 1461912206_file_here_files.xlsx 
     ) 

) 

Второй массив, как

Array 
(
    [1] => Array 
     (
      [source_language] => English 
      [target_language] => Array 
       (
        [0] => Urdu 
        [1] => Hindi 
       ) 

     ) 

    [2] => Array 
     (
      [source_language] => Hindi 
      [target_language] => Array 
       (
        [0] => Norwegian 
       ) 

     ) 
    [3] => Array 
     (
      [source_language] => Hindi 
      [target_language] => Array 
       (
        [0] => German 
       ) 

     ) 
    [3] => Array 
     (
      [source_language] => English 
      [target_language] => Array 
       (
        [0] => German 
        [1] => Norwegian 
       ) 

     )     

) 

Теперь вы можете как массив и тот же ключ для source_langauge и target_language. Ключ title и file_name доступен только в первом массиве

Так что я хочу, что первый массив будет искать все SOURCE_LANGUAGE и TARGET_LANGUAGE из второго массива и показывать только совпадающие массивы и удобства сопоставления массивов

Так что выход должен быть, как этот

The matching array is 

[0] => Array 
    (
     [source_language] => English 
     [target_language] => Array 
      (
       [0] => German 
       [1] => Norwegian 
      ) 

     [title] => file 1.xlsx 
     [file_name] => 1461911750_file_test.xlsx 
    ) 

, как это имеет тот же язык значения исходного и целевого языка во втором массиве

другой результат будет показать это

non matching array is 

[0] => Array 
    (
     [source_language] => Hindi 
     [target_language] => Array 
      (
       [0] => Belarusian 
      ) 

     [title] => new files.xlsx 
     [file_name] => 1461912206_file_here_files.xlsx 
    ) 

поскольку этот исходный язык и языки назначения не найдены во втором массиве.

Update

я пытался до сих пор

$diffs = []; 

     foreach ($first_array as $a1) { 
      $h1 = md5(json_encode($a1)); 
      $found = false; 

      foreach ($second_array as $a2) { 
      if (md5(json_encode($a2)) == $h1) { 
       $found = true; 
       break; 
      } 
      } 


      if (!$found) { 
      $diffs []= $a1; 
      } 
     } 

Но это одна не работает на всех

+0

Что вы уже пробовали? – RST

+0

@RST проверить мой обновленный вопрос. Я упомянул, что я пробовал до сих пор – NewUser

+0

возможно 'array_diff_assoc()' поможет вам – aldrin27

ответ

0

Во-первых, вы не можете сравнить $h1 с $a2, поскольку они надевают Не разделяйте ту же структуру.

$h1 все еще имеет то, что title и filename значение пары ключей.

Нет необходимости использовать md5 и json_encode, так как вы просто нужно сравнить два строковых значения:

$match = $no_match = array(); 
foreach($first as $f) { 
    $found = false; 
    foreach($second as $s) { 
     if(
      $f['source_language'] === $s['source_language'] && 
      $f['target_language'] === $s['target_language'] 
      ) { 
      $match[] = $f; 
      $found = true; 
     } 
    } 
    if(!$found) { 
     $no_match[] = $f; 
    } 
} 
0
<?php 
$arr1 = array(); 
$arr2 = array(); 
$arr1[0] = array('source_language'=>'English','target_language'=>array('German','Norwegian'),'title'=>'file 1.xlsx','file_name'=>'1461911750_file_test.xlsx'); 

$arr1[1] = array('source_language'=>'Hindi','target_language'=>array('Belarusian'),'title'=>'new files.xlsx','file_name'=>'1461912206_file_here_files.xlsx'); 

$arr2[0] = array('source_language'=>'English','target_language'=>array('Urdu','Hindi')); 
$arr2[1] = array('source_language'=>'Hindi','target_language'=>array('Norwegian')); 
$arr2[2] = array('source_language'=>'Hindi','target_language'=>array('German')); 
$arr2[3] = array('source_language'=>'English','target_language'=>array('German','Norwegian')); 

$result_arr = array(); 
for($i=0;$i<count($arr2);$i++) 
{ 
    for($j=0;$j<count($arr1);$j++) 
    { 
     if(($arr2[$i]['source_language'] === $arr1[$j]['source_language']) && ($arr2[$i]['target_language'] === $arr1[$j]['target_language'])) 
      $result_arr[] = $arr1[$j]; 
    } 
} 

print_r(json_encode($result_arr)); 

?> 
0

Решение с использованием array_walk и array_diff функции:

$matched = $not_matched = []; 
array_walk($array1, function($v) use($array2, &$matched, &$not_matched){ 
    foreach ($array2 as $item) { 
     if ($v['source_language'] == $item['source_language'] 
      && empty(array_diff($v['target_language'], $item['target_language']))) { 
      $matched[] = $v; 
      break; 
     } 
    } 
    if (!in_array($v, $matched)) $not_matched[] = $v; 
}); 

echo "Matched items:". PHP_EOL; 
print_r($matched); 

echo "Not-matched items:". PHP_EOL; 
print_r($not_matched); 

Выходной сигнал:

Matched items: 
Array 
(
    [0] => Array 
     (
      [source_language] => English 
      [target_language] => Array 
       (
        [0] => German 
        [1] => Norwegian 
       ) 

      [title] => file 1.xlsx 
      [file_name] => 1461911750_file_test.xlsx 
     ) 
) 

Not-matched items: 
Array 
(
    [0] => Array 
     (
      [source_language] => Hindi 
      [target_language] => Array 
       (
        [0] => Belarusian 
       ) 

      [title] => files.xlsx 
      [file_name] => 1461912206_file_here_files.xlsx 
     ) 
) 
Смежные вопросы