Пересечение многомерных ассоциативных массивов php

У меня два многомерных массива

$array1 = Array ( [a1] => Array ( [a_name] => aaaaa [a_value] => aaa ) [b1] => Array ( [b_name] => bbbbb [b_value] => bbb ) [c1] => Array ( [c_name] => ccccc [c_value] => ccc ) ) $array2 = Array ( [b1] => Array ( [b_name]=> zzzzz ) ) 

Я хочу пересечение ключей $array1 и $array2 . Результат должен быть от $array1 .

Solutions Collecting From Web of "Пересечение многомерных ассоциативных массивов php"

 function recursive_array_intersect_key(array $array1, array $array2) { $array1 = array_intersect_key($array1, $array2); foreach ($array1 as $key => &$value) { if (is_array($value) && is_array($array2[$key])) { $value = recursive_array_intersect_key($value, $array2[$key]); } } return $array1; } 

Демо здесь .

 $output = array_intersect_key($array1, $array2); 

Демонстрация 2-мерного ассоциативного пересечения массивов в PHP

Код:

 <?php function compare_states($a1, $a2){ $diff1 = strcasecmp($a1['state_id'], $a2['state_id']); $diff2 = strcasecmp($a1['state_name'], $a2['state_name']); if ($diff1 != 0) return $diff1; if ($diff2 != 0) return $diff2; return 0; } function calculate_intersection($a1, $a2){ return array_uintersect($a1, $a2, 'compare_states'); } ?> 

Как запустить его:

 <?php $a = Array(Array("state_id"=>14, "state_name"=>"Illinois")); $b = Array(Array("state_id"=>14, "state_name"=>"Illinois")); $new = calculate_intersection($a, $b); print_r($a); //in this simple case, the intersection is equivalent to $a. $a = Array(Array("state_id"=>14, "state_name"=>"Illinois")); $b = Array(Array("state_id"=>14, "state_name"=>"Foobar")); $new = calculate_intersection($a, $b); print_r($a); //in this case, the intersection is empty. ?> 

Единичные тесты, чтобы доказать, что приведенный выше код работает в соответствии с проектом:

 $a = Array(); $b = Array(); $new = calculate_intersection($a, $b); print "\nGroup1\n"; print ((count($new) == count($a) && count($a) == count($b)) ? "." : "FAIL"); print ((count($new) == 0) ? "." : "FAIL"); //============================================== $a = Array(Array("state_id"=>14, "state_name"=>"Illinois")); $b = Array(Array("state_id"=>14, "state_name"=>"Illinois")); $new = calculate_intersection($a, $b); print "\nGroup2\n"; print ((count($new) == count($a) && count($a) == count($b)) ? "." : "FAIL"); print ((count($new) == 1) ? "." : "FAIL"); print (($new[0]['state_id'] == 14 ? "." : "FAIL")); print (($new[0]['state_name'] == "Illinois" ? "." : "FAIL")); //============================================== print "\nGroup3\n"; $a = Array(Array("state_id"=>14, "state_name"=>"Illinois"), Array("state_id"=> "22", "state_name"=>"Massachusetts")); $b = Array(Array("state_id"=>14, "state_name"=>"Illinois"), Array("state_id"=> "22", "state_name"=>"Massachusetts")); $new = calculate_intersection($a, $b); print ((count($new) == count($a) && count($a) == count($b)) ? "." : "FAIL"); print (($new[0]['state_id'] == 14 ? "." : "FAIL")); print (($new[0]['state_name'] == "Illinois" ? "." : "FAIL")); print (($new[1]['state_id'] == 22 ? "." : "FAIL")); print (($new[1]['state_name'] == "Massachusetts" ? "." : "FAIL")); //============================================== $a = Array(Array("state_id"=>"14", "state_name"=>"Illinois")); $b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts")); $new = calculate_intersection($a, $b); print "\nGroup5\n"; print ((count($new) == 0) ? "." : "FAIL"); //============================================== $a = Array(Array("state_id"=>"14", "state_name"=>"Illinois")); $b = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"22", "state_name"=>"Massachusetts")); $new = calculate_intersection($a, $b); print "\nGroup6\n"; print ((count($new) == 1) ? "." : "FAIL"); print (($new[0]['state_id'] == 14) ? "." : "FAIL"); print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL"); //============================================== $a = Array(Array("state_id"=>"14", "state_name"=>"Illinois")); $b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"), Array("state_id"=>"14", "state_name"=>"Illinois")); $new = calculate_intersection($a, $b); print "\nGroup7\n"; print ((count($new) == 1) ? "." : "FAIL"); print (($new[0]['state_id'] == 14) ? "." : "FAIL"); print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL"); //============================================== $a = Array(Array("state_id"=>"14", "state_name"=>"Illinois")); $b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"), Array("state_id"=>"14", "state_name"=>"Fromulate")); $new = calculate_intersection($a, $b); print "\nGroup8\n"; print ((count($new) == 0) ? "." : "FAIL"); //============================================== $a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"14", "state_name"=>"Illinois")); $b = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"14", "state_name"=>"Illinois")); $new = calculate_intersection($a, $b); print "\nGroup9\n"; print ((count($new) == 2) ? "." : "FAIL"); print (($new[0]['state_id'] == 14) ? "." : "FAIL"); print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL"); print (($new[1]['state_id'] == 14) ? "." : "FAIL"); print (($new[1]['state_name'] == "Illinois") ? "." : "FAIL"); //============================================== $a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"22", "state_name"=>"Massachusetts")); $b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"), Array("state_id"=>"14", "state_name"=>"Illinois")); $new = calculate_intersection($a, $b); print "\nGroup7\n"; print ((count($new) == 2) ? "." : "FAIL"); print (($new[0]['state_id'] == 14) ? "." : "FAIL"); print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL"); print (($new[1]['state_id'] == 22) ? "." : "FAIL"); print (($new[1]['state_name'] == "Massachusetts") ? "." : "FAIL"); ?> 

Вышеприведенный код печатает:

 eric@dev $ php a.php Group1 .. Group2 .... Group3 ..... Group5 . Group6 ... Group7 ... Group8 . Group9 ..... Group7 ..... 

Все точки означают, что все прошло.

В каких случаях этот код заботится?

  1. Оба массива пустые. Пересечение пусто.
  2. Один пустой, а другой – предметы. Пересечение пусто.
  3. Оба массива имеют одинаковые элементы, устанавливают: 1 и устанавливают: n. Пересечение эквивалентно первому массиву.
  4. Оба массива идентичны, за исключением перетасовки. Пересечение эквивалентно первому массиву.
  5. Массивы идентичны, за исключением того, что в каждом случае имя состояния различно, а state_id – то же самое. Пересечение пусто.
  6. Array a имеет элементы, необычные для b, элементы, общие для B. Массив b имеет элементы, необычные для a и элементы, общие для A. Пересечение – это элементы, общие для a и b.

Что это не делает:

Он не проверяет нулевые / неопределенные / разнородные массивы глубины, а массивы не содержат 2 или более слоев. Если типы данных будут заменены, сравнивая строки с int или плавающие в восьмеричные, это, вероятно, не удастся. Трудно заставить PHP правильно выполнять равенство. http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/

Сделайте все возможное, чтобы попытаться сделать эту работу в базе данных, сделав это на PHP, ударит рог, чтобы вызвать неработающего кита. Это неэффективно, поэтому вам лучше не работать более чем на несколько сотен предметов. Это удивит вас левым ударом по неожиданным случаям, и это трудно понять / понять, что он делает под капотом.

Я думаю, вы должны проверить, является ли массив $ array2 [$ key] массивом.

 function recursive_array_intersect_key(array $array1, array $array2) { $array1 = array_intersect_key($array1, $array2); foreach ($array1 as $key => &$value) { if (is_array($value) && is_array($array2[$key])) { $value = recursive_array_intersect_key($value, $array2[$key]); } } return $array1; }