Cross Vander
Cross Vander

Reputation: 2157

How to compare 2 array with same key but different value PHP

I want to ask about compare 2 arrays with same key but different value.

I have 1 array master (arrayMaster) and 2 or more array data (arrayData1, arrayData2, and maybe could be more). These array data key will have exactly one of arrayMaster data key (I've done for this thing). For data example that I get:

arrayMaster = Array( [apple] => 1 [banana] => 2 [choco] => 1 [donut] => 2 [egg] => 1 )
arrayData1 = Array( [apple] => 8 [banana] => 2 [choco] => 1 )
arrayData2 = Array( [donut] => 5 [choco] => 2 [egg] => 3 ) 

(We can see that arrayData1 and arrayData2 contain a key from arrayMaster key.)

These arrays I want to compare and give a calculating method. If the array key at arrayData(n) found at arrayMaster, it will do a calculating data, let said it will sum each other.

So, the result is:

arrayResult1 = 1+8 (apple have 1 from master, apple have 8 from arrayData1), 2+2, 1+1
arrayResult2 = 2+5 (donut have 2 from master, donut have 5 from arrayData2), 1+2, 1+3

So I will have 2 new array (or more, depend on how much arrayData) that contain:

arrayResult1 = ([apple] => 9 [banana] => 4 [choco] => 2);
arrayResult2 = ([donut] => 7 [choco] => 3, [egg] => 4);

Anyone know how to do this? I’”ve tried array_intersect but it didn’t work.

Upvotes: 3

Views: 4815

Answers (3)

Giacomo1968
Giacomo1968

Reputation: 26066

Using these as examples:

arrayResult1 = 1+8 (apple have 1 from master, apple have 8 from arrayData1), 2+2, 1+1
arrayResult2 = 2+5 (donut have 2 from master, donut have 5 from arrayData2), 1+2, 1+3

Why not just do this:

// The main arrays for master & data values.
$arrayMaster = array('apple' => 1, 'banana' => 2, 'choco' => 1, 'donut' => 2, 'egg' => 1);
$arrayData1 = array('apple' => 8, 'banana' => 2, 'choco' => 1);
$arrayData2 = array('donut' => 5, 'choco' => 2, 'egg' => 3);

// Set a values to check array.
$values_to_check = array('apple', 'donut');

// Init the results array.
$results_array = array();

// Roll through the values to check.
foreach ($values_to_check as $value) {

  // Check if the array key exists in '$arrayMaster'.
  if (array_key_exists($value, $arrayMaster)) {

    // If it exists, add it to the '$results_array'.
    $results_array[$value][] = $arrayMaster[$value];

    // Check if the array key exists in '$arrayData1'.
    if (array_key_exists($value, $arrayData1)) {
      // If it exists, add it to the '$results_array'.
      $results_array[$value][] = $arrayData1[$value];
    }

    // Check if the array key exists in '$arrayData2'.
    if (array_key_exists($value, $arrayData2)) {
      // If it exists, add it to the '$results_array'.
      $results_array[$value][] = $arrayData2[$value];
    }

  }

}

// Roll through the results array and use 'array_sum' to get a sum of values.
foreach ($results_array as $results_key => $results_value) {
  echo $results_key . ' : ' . array_sum($results_value) . '<br />';
}

But looking at your example, I am unclear on why you have separate arrays for $arrayData1 and $arrayData2 so here is the same code, but refactored to have nested arrays in $arrayData which should be more efficient:

// The main arrays for master & data values.
$arrayMaster = array('apple' => 1, 'banana' => 2, 'choco' => 1, 'donut' => 2, 'egg' => 1);
$arrayData = array();
$arrayData[] = array('apple' => 8, 'banana' => 2, 'choco' => 1);
$arrayData[] = array('donut' => 5, 'choco' => 2, 'egg' => 3);

// Set a values to check array.
$values_to_check = array('apple', 'donut');

// Init the results array.
$results_array = array();

// Roll through the values to check.
foreach ($values_to_check as $value) {

  // Check if the array key exists in '$arrayMaster'.
  if (array_key_exists($value, $arrayMaster)) {

    // If it exists, add it to the '$results_array'.
    $results_array[$value][] = $arrayMaster[$value];

    // Roll through the values to check.
    foreach ($arrayData as $arrayData_value) {
      // Check if the array key exists in '$arrayData1'.
      if (array_key_exists($value, $arrayData_value)) {
        // If it exists, add it to the '$results_array'.
        $results_array[$value][] = $arrayData_value[$value];
      }
    }

  }

}

// Roll through the results array and use 'array_sum' to get a sum of values.
foreach ($results_array as $results_key => $results_value) {
  echo $results_key . ' : ' . array_sum($results_value) . '<br />';
}

Upvotes: 1

You can write something simpler like this..

function modifyArr(&$arr,$basearray) //<=-- See I am passing & (reference) so your original array will be modified
{
foreach($arr as $k=>$v)
 {
    if(array_search($k,$basearray)!==null)
    {
        $arr[$k]=$basearray[$k]+$arr[$k];
    }
 }
}

modifyArr($arrayData1,$arrayMaster); //<=-- Pass your 1st array
modifyArr($arrayData2,$arrayMaster); //<=-- Pass your 2nd array

Demonstration

Upvotes: 2

Cully
Cully

Reputation: 6965

Do something like this:

function doCalc($master, $slave) {
    $results = array();

    foreach( $slave as $key => $value ) {
        if( !isset($master[$key]) ) {
            $results[$key] = $value;
        }
        else {
            $results[$key] = $master[$key] + $value;
        }
    }

    return $results;
}

$arrayResult1 = doCalc($arrayMaster, $arrayData1);
$arrayResult2 = doCalc($arrayMaster, $arrayData2);

Upvotes: 3

Related Questions