У меня два многомерных массива
$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
.
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);
Код:
<?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 .....
Все точки означают, что все прошло.
В каких случаях этот код заботится?
Что это не делает:
Он не проверяет нулевые / неопределенные / разнородные массивы глубины, а массивы не содержат 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; }