1

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;
                    }
                }
            }
        }
    }

3 Answers3

0

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);
Tehseen Ahmed
  • 147
  • 3
  • 15
0

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);
Rafiqul Islam
  • 1,636
  • 1
  • 12
  • 25
0

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;
}
Community
  • 1
  • 1