问题描述
我有一个如下所示的多维数组:
I have a multidimensional array that looks like this:
Array ( [0] => Array ( [0] => Array ( [id] => 3 ) [1] => Array ( [id] => 1 ) [2] => Array ( [id] => 2 ) [3] => Array ( [id] => 5 ) [4] => Array ( [id] => 4 ) ) [1] => Array ( [0] => Array ( [id] => 1 ) [1] => Array ( [id] => 3 ) [2] => Array ( [id] => 4 ) [3] => Array ( [id] => 5 ) ) [2] => Array ( [0] => Array ( [id] => 3 ) ) )
我需要找到一种返回相交值的方法.在这种情况下,这将是
I need to find a way to return the intersecting value(s). In this case that would be
[id] => 3
数组的长度可能不同,所以我不能只使用array_intersect().
The length of the array could be different, so I can't just use array_intersect().
推荐答案
如果你的数组只包含整数,这会很简单,但是当它们包含另一个数组时,它会变得有点复杂.但这应该可以:
This would be simple if your arrays contained only integers, but as they contain an another array, it gets a bit more complicated. But this should do it:
function custom_intersect($arrays) { $comp = array_shift($arrays); $values = array(); // The other arrays are compared to the first array: // Get all the values from the first array for comparison foreach($comp as $k => $v) { // Set amount of matches for value to 1. $values[$v['id']] = 1; } // Loop through the other arrays foreach($arrays as $array) { // Loop through every value in array foreach($array as $k => $v) { // If the current ID exists in the compare array if(isset($values[$v['id']])) { // Increase the amount of matches $values[$v['id']]++; } } } $result = array(); // The amount of matches for certain value must be // equal to the number of arrays passed, that's how // we know the value is present in all arrays. $n = count($arrays) + 1; foreach($values as $k => $v) { if($v == $n) { // The value was found in all arrays, // thus it's in the intersection $result[] = $v; } } return $result; }
用法:
$arrays = array( array(array('id' => 3), array('id' => 1), array('id' => 2), array('id' => 5), array('id' => 4)), array(array('id' => 1), array('id' => 3), array('id' => 4), array('id' => 5)), array(array('id' => 3)) ); print_r(custom_intersect($arrays));
结果:
Array ( [0] => 3 )
此功能并不完美:如果您在一个数组中有重复的 ID,它将无法工作.这将需要更多的代码来首先使数组值唯一,但这可能适用于您的情况.
This function isn't perfect: if you have duplicate ID's in one array, it will not work. That would require a bit more code to first make the array values unique, but this will probably work in your case.