I have an array like this,
Array
(
[0] => Array
(
[0] => Array
(
[productId] => 145
[variantId] => 179
)
[1] => Array
(
[productId] => 145
[variantId] => 180
)
[2] => Array
(
[productId] => 147
[variantId] => 181
)
[3] => Array
(
[productId] => 147
[variantId] => 182
)
)
[1] => Array
(
[0] => Array
(
[productId] => 147
[variantId] => 181
)
[1] => Array
(
[productId] => 147
[variantId] => 184
)
)
[2] => Array
(
[0] => Array
(
[productId] => 145
[variantId] => 178
)
[1] => Array
(
[productId] => 145
[variantId] => 180
)
[2] => Array
(
[productId] => 147
[variantId] => 181
)
[3] => Array
(
[productId] => 147
[variantId] => 185
)
[4] => Array
(
[productId] => 147
[variantId] => 186
)
)
)
For this input we can see that [productId] => 147,[variantId] => 181
is common an all index of array.
Im using foreach
to check this. But my code is working fine for 2 index, but not for more than 2 index.
In foreach
im taking 0th
index and comparing with other index, but not working.
Here is the code i have used so far.
$first = $name1[0];
$a = array();
unset($name1[0]);
foreach ($name1 as $row) {// foreach main array
foreach ($first as $row1) {// foreach first index of array array
foreach ($row as $kkk => $r1) {//foreach index of main array
// if first array's index's product is is equal to main array index's product id, push values to one array
if ($row1['productId'] == $r1['productId']) {
if (isset($row1['variantId']) && isset($r1['variantId'])) {
if ($row1['variantId'] == $r1['variantId']) {
$a[] = $r1;
}
} else {
$a[] = $r1;
}
}
}
}
}
First method
Use this, PHP functions are faster than trying to build your own algorithm.
$result = array_intersect($array1, $array2);
Second Method
$array1 = array("5","26","38","42");
$array2 = array("15","36","38","42");
$final_array = array();
foreach($array1 as $key=>$val){
if(in_array($val,$array2)){
$final_array[] = $val;
}
}
print_r($final_array);
Result: Array ( [0] => 38 [1] => 42 )
for 2d array
function multi_intersect($arr) {
$return = array();
foreach ($arr as $a) {
foreach ($arr as $b) {
if ($a === $b) continue;
$return = array_merge($return, array_intersect($a, $b));
}
}
return array_unique($return);
}
you should get
Array
(
[0] => 58
)
so finally you use this to get result
$intersect = call_user_func_array('array_intersect', $arr);
You can use foreach
inside a foreach
loop
$my_array = array
(
'0' => array
(
'0' => array
(
'productId' => 145,
'variantId' => 179
),
'1' => array
(
'productId' => 145,
'variantId' => 180
),
'2' => array
(
'productId' => 147,
'variantId' => 181
),
'3' => array
(
'productId' => 147,
'variantId' => 182
)
),
'1' => array
(
'0' => array
(
'productId' => 147,
'variantId' => 181
),
'1' => array
(
'productId' => 147,
'variantId' => 184
)
),
'2' => array
(
'0' => array
(
'productId' => 145,
'variantId' => 178
),
'1' => array
(
'productId' => 145,
'variantId' => 180
),
'2' => array
(
'productId' => 147,
'variantId' => 181
),
'3' => array
(
'productId' => 147,
'variantId' => 185
),
'4' => array
(
'productId' => 147,
'variantId' => 186
)
)
);
$final_array = array();
foreach($my_array as $nested_array){
foreach($nested_array as $val ){
$final_array[] = $val;
}
}
echo "<pre>"; print_r($final_array);
Here is the answer which i wanted,
function serialize_array_values($arr){
foreach($arr as $key=>$val){
sort($val);
$arr[$key]=serialize($val);
}
return $arr;
}
$result = array_map("unserialize", array_intersect(
serialize_array_values($name1[0]),
serialize_array_values($name1[1]),
serialize_array_values($name1[2])
));
https://eval.in/738165, check the working link
Reference : array_intersect throws errors when arrays have sub-arrays
Finally here is my working code
foreach ($name1 as $kkk => $row) {
$list[] = $this->serializeArrayValues($row);
}
$intersect = call_user_func_array('array_intersect', $list);
$a = array_map("unserialize", $intersect);
function serializeArrayValues($arr) {
foreach ($arr as $key => $val) {
$arr[$key] = serialize($val);
}
return $arr;
}