Question

I want to compare two arrays in php. My arrays looks like this

Array ( 
[0] => Array ( [Id] => 1 [row1] => 1458)
[1] => Array ( [Id] => 2 [row1] => 16) 
[2] => Array ( [Id] => 3 [row1] => 115) 
[3] => Array ( [Id] => 4 [row1] => 18) 
[4] => Array ( [Id] => 5 [row1] => 13) 
[5] => Array ( [Id] => 6 [row1] => 13) 
[6] => Array ( [Id] => 7 [row1] => 131)
)

Array ( 
[0] => Array ( [Id] => 1 [row1] => 158)
[1] => Array ( [Id] => 2 [row1] => 165) 
[2] => Array ( [Id] => 3 [row1] => 111) 
[3] => Array ( [Id] => 4 [row1] => 186) 
[4] => Array ( [Id] => 5 [row1] => 3)
)

Firstly, array1 size and array2 sizes were not equal always. Id value in array1 may or may not present in array2, If the value is not present, function have to print the total index in array3, like

[someindex] => Array ( [Id] => 6 [row1] => 13 )

if it is present, function should subtract the row1 of array1 to row1 of array2 and print in array3, like this

[someindex] => Array ( [Id] => 1 [row1] => 1300)

and my final output should be,

Array ( 
[0] => Array ( [Id] => 1 [row1] => 1300)
[1] => Array ( [Id] => 2 [row1] => -149) 
[2] => Array ( [Id] => 3 [row1] => 4) 
[3] => Array ( [Id] => 4 [row1] => -168) 
[4] => Array ( [Id] => 5 [row1] => 10) 
[5] => Array ( [Id] => 6 [row1] => 13) 
[6] => Array ( [Id] => 7 [row1] => 131)
)

Can any one help me in solving this problem.

Was it helpful?

Solution 2

First, you either have to make the second array searchable by using the Id value as the keys or write a search function. I'm choosing the former:

$searchable = array_reduce($array2, function(&$result, $item) {
    return $result + array($item['Id'] => $item['row1']);
}, array());

The array_reduce() function starts with an empty array and builds it using the array addition operator; this creates an array that can be dereferenced using the id.

Then you perform a map operation on the first array:

$array3 = array_map(function($item) use ($searchable) {
    $value = isset($searchable[$item['Id']]) ? $searchable[$item['Id']] : 0;
    $item['row1'] -= $value;
//    $item['row2'] = $item['row1'] - $value;
    return $item;
}, $array1);

Doing a map operation preserves the original array and creates a new one with the values you choose inside a callback function.

OTHER TIPS

$arr1 = Array ( 
    0 => Array ('Id' => 1, 'row1' => 1458)
    ,1 => Array ('Id' => 2, 'row1' => 16) 
    ,2 => Array ('Id' => 3, 'row1' => 115) 
    ,3 => Array ('Id' => 4, 'row1' => 18) 
    ,4 => Array ('Id' => 5, 'row1' => 13) 
    ,5 => Array ('Id' => 6, 'row1' => 13) 
    ,6 => Array ('Id' => 7, 'row1' => 131)
);
$arr2 = Array ( 
    0 => Array('Id' => 1, 'row1' => 158)
    ,1 => Array('Id' => 2, 'row1' => 165) 
    ,2 => Array('Id' => 3, 'row1'=> 111) 
    ,3 => Array('Id' => 4, 'row1' => 186) 
    ,4 => Array('Id' => 5, 'row1' => 3)
);
$final = array();
foreach($arr1 as $k => $sec)
{
    $sub = 0;
    foreach($arr2 as $sec2)
    {
        if($sec2['Id']==$sec['Id'])
        {
            $sub = $sec2['row1'];
            break;
        }
    }
    $sec['row1'] -= $sub;
    //Or to save to another element:
    //$sec['row2'] = $sec['row1']-$sub;
    $final[] = $sec;
}

echo '<pre>'.print_r($final,true).'</pre>';

Output:

Array ( 
    [0] => Array ( [Id] => 1 [row1] => 1300)
    [1] => Array ( [Id] => 2 [row1] => -149) 
    [2] => Array ( [Id] => 3 [row1] => 4) 
    [3] => Array ( [Id] => 4 [row1] => -168) 
    [4] => Array ( [Id] => 5 [row1] => 10) 
    [5] => Array ( [Id] => 6 [row1] => 13) 
    [6] => Array ( [Id] => 7 [row1] => 131)
)

Don't know if this exactly what you want, but you can check if a key exists with array_key_exists:

$array3 = array();
foreach ($array1 as $k => $v) {
        if (array_key_exists($k, $array2)) {
            $array3[] = $v - $array2[$k];
        } else {
            $array3[] = $v;
        }
    }

This creates an indexing array ($new) in case the main keys don't match of in the original arrays.

$arr = array ( 
    0 => array ( 'Id' => '1','row1' => 1458),
    1 => array ( 'Id' => '2','row1' => 16),
    2 => array ( 'Id' => '3','row1' => 115),
    3 => array ( 'Id' => '4','row1' => 18),
    4 => array ( 'Id' => '5','row1' => 13),
    5 => array ( 'Id' => '6','row1' => 13),
    6 => array ( 'Id' => '7','row1' => 131));
$arr2 = array ( 
    0 => array ( 'Id' => '1','row1' => 158),
    1 => array ( 'Id' => '2','row1' => 165),
    2 => array ( 'Id' => '3','row1' => 111),
    3 => array ( 'Id' => '4','row1' => 186),
    4 => array ( 'Id' => '5','row1' => 3));
$new = array();
foreach ($arr2 as $key => $value){
    $new[$value['Id']] = $value['row1'];
}
foreach ($arr as $key => $value){
    if (isset($new[$value['Id']])){
        $arr[$key]['row1'] -= $new[$value['Id']];
    }
}
print_r($arr);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top