PHP - Search value in sub array

Viewed 32

I have two arrays that have to be migrated.

    $products = array(
         array(
             'title'   => 'Product #1',
             'sku'     => 53159,
             'price'   => 12,
             'image'   => 'product_01.jpg'
         ),
         array(
             'title'   => 'Product #2',
             'sku'     => 60290,
             'price'   => 12,
             'image'   => 'product_01.jpg'
         ),
         array(
             'title'   => 'Product #3',
             'sku'     => 24195,
             'price'   => 12,
             'image'   => 'product_01.jpg'
         )
    );

    $similar_products = array(
        array(25195, 53159),
        array(60290, 33619),
        array(80001, 24195)
    );

I wan't to build a final array with the following result:

    $final= array(
         array(
             'title'   => 'Product #1',
             'sku'     => 53159,
             'similar' => 25195,
             'price'   => 12,
             'image'   => 'product_01.jpg'
         ),
         array(
             'title'   => 'Product #2',
             'sku'     => 60290,
             'similar' => 33619,
             'price'   => 12,
             'image'   => 'product_01.jpg'
         ),
         array(
             'title'   => 'Product #3',
             'sku'     => 24195,
             'similar' => 80001,
             'price'   => 12,
             'image'   => 'product_01.jpg'
         )
    );

I tried to find the similar skus with in_array inside a foreach loop:

foreach ( $products as $product ) {

    foreach ( $similar_products as $similar_product) {
    
       if ( in_array( $product['sku'] ,$similar_product) ) {
           // Build the $final array here
       }
    
    }

}

but it's taking too long.

I there any other method to help me getting faster the similar sku?

1 Answers
$final = $products;
foreach ($similar_products as [$similar, $sku]) {
    $index = array_search($sku, array_column($final, 'sku'));
    if (false === $index) {
        $index                    = array_search($similar, array_column($final, 'sku'));
        $final[$index]['similar'] = $sku;
        continue;
    }
    $final[$index]['similar'] = $similar;
}

Final looks like Demo: https://3v4l.org/1Dl62/perf

Array
(
    [0] => Array
        (
            [title] => Product #1
            [sku] => 53159
            [price] => 12
            [image] => product_01.jpg
            [similar] => 25195
        )

    [1] => Array
        (
            [title] => Product #2
            [sku] => 60290
            [price] => 12
            [image] => product_01.jpg
            [similar] => 33619
        )

    [2] => Array
        (
            [title] => Product #3
            [sku] => 24195
            [price] => 12
            [image] => product_01.jpg
            [similar] => 80001
        )

)
Related