2014-05-11 2 views
3

Я хочу спросить о сравнении 2 массивов с одним и тем же ключом, но с другим значением.Как сравнить 2 массива с одним и тем же ключом, но с другим значением PHP

У меня есть 1 массив master (arrayMaster) и 2 или более данных массива (arrayData1, arrayData2, и, возможно, может быть больше). Этот ключ данных массива будет иметь только один из ключей данных arrayMaster (я сделал это для этой цели). Например данные, которые я получаю:

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) 

(Мы можем видеть, что arrayData1 и arrayData2 содержат ключ от arrayMaster ключа.)

Этих массивов Я хочу, чтобы сравнить и дать метод расчета. Если ключ массива в arrayData(n) найден в arrayMaster, он будет выполнять расчетные данные, пусть сказал, что он будет суммировать друг друга.

Итак, результат:

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 

Так что я буду иметь 2 новый массив (или больше, в зависимости от того, насколько ArrayData), которые содержат:

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

Кто знает, как это сделать ? Я пробовал array_intersect, но это не сработало.

ответ

2

Вы можете написать что-то проще, как это ..

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

+1

Отлично! Большое спасибо Шанкару. Решила мою проблему с кодом :) –

+1

Ваш приветственный помощник. Рад помочь ... –

3

ли что-то вроде этого:

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); 
0

Используя их в качестве примеров:

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 

Почему бы не просто сделать это:

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

Но, глядя на ваш пример, я не ясно, почему у вас есть отдельные массивы для $arrayData1 и $arrayData2 так вот один и тот же код, но переработан, чтобы иметь вложенные массивы в $arrayData который должен быть более эффективным:

// 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 />'; 
} 
+2

Что это за 'area_key_exists'? исправьте его. Это должно быть 'array_key_exists'. –

+0

@ShailParas Да, опечатка. Кодирование в браузере и авто-проверка орфографии зацепило меня за это. Теперь сделаем реальный PHP и будем обновлять, чтобы это работало. Перекодировали мой пример и добавили еще один выше того, что вы видели ранее. – JakeGould

+2

Hi JakeGould, если я использую ваш код, theres только проверяют яблоко и бананы, то, что я хочу, это проверить все ключи в массиве. Но никогда не используйте метод Shankar, и он отлично работает ... Спасибо за вашу помощь тоже .. –

Смежные вопросы