2012-08-30 18 views
0

考慮以下數組。他們代表了前5執行員工yesterdaytoday如何比較數組a與b並創建新數組c(a和b中的項),d(a中的項,而不是b)和e(b中的項,而不是a中的項)?

$yesterday = array(
    6 => array('name' => 'Tod', 'score' => 9.5), 
    12 => array('name' => 'Jim', 'score' => 7.3), 
    18 => array('name' => 'Bob', 'score' => 8.4), 
    7 => array('name' => 'Jan', 'score' => 6.2), 
    20 => array('name' => 'Sam', 'score' => 6.0), 
); 

$today = array(
    6 => array('name' => 'Tod', 'score' => 9.1), 
    9 => array('name' => 'Jef', 'score' => 9.3), 
    35 => array('name' => 'Axl', 'score' => 7.6), 
    7 => array('name' => 'Jan', 'score' => 6.5), 
    41 => array('name' => 'Ted', 'score' => 8.0), 
); 

我需要從上面編3個新的數組:$stay控股的員工誰是在昨天前五名,並且仍然有今天,$gone,控股昨天的員工誰是在前五名,但都沒有了,而且$new,拿着新人$today頂級-5列表:

// notice that the scores in $stay come from $today, not $yesterday 
// also notice that index keys are maintained 

$stay = array(
    6 => array('name' => 'Tod', 'score' => 9.1), 
    7 => array('name' => 'Jan', 'score' => 6.5) 

); 

$gone = array(
    12 => array('name' => 'Jim', 'score' => 7.3), 
    18 => array('name' => 'Bob', 'score' => 8.4), 
    20 => array('name' => 'Sam', 'score' => 6.0) 
); 

$new = array(
    9 => array('name' => 'Jef', 'score' => 9.3), 
    35 => array('name' => 'Axl', 'score' => 7.6), 
    41 => array('name' => 'Ted', 'score' => 8.0) 
); 

我對如何在這裏建立的邏輯毫無頭緒。我從一個循環開始,但並沒有走得太遠。我相信它應該是這樣的。你能幫我解決這個問題嗎?

for ($i = 0; $i < count($yesterday); $i++) { 
    // I'm comparing key numbers, but not key values 
    // how do I compare key values? 
    if (in_array($yesterday[$i], $today) { 
    // add to $stay array 
    } 
    else { 
    // add to $gone array 
    } 
} 

for ($i = 0; $i < count($today); $i++) { 
    if (!in_array($today[$i], $yesterday) { 
    // add to $new array 
    } 
} 

P.S.我不知道這是否有幫助,但$yesterday$today總是等長(在這種情況下,5個項目,但其他情況下,其中兩個陣列可以容納7個或10個項目)。的$stay$new合併項目邏輯總是等於在任何$yesterday$today :-)

回答

1

這可以用短短的完成PHP的許多功能強大的array functions

$stay = array_intersect_assoc($yesterday, $today); 
$gone = array_diff_assoc($yesterday, $today); 
$new = array_diff_assoc($today, $yesterday); 
+0

這個評論是供@peter的答案,但我缺乏足夠的代表;注意array_intersect()和array_diff()在這個問題的範圍內是不夠的,因爲它們沒有正確計算*關聯*數組。 – smithbh

1

我認爲這應該工作的項目數但是,這不是最快的方法這樣做我認爲。

$stay = array(); 
$gone = array(); 
$new = array(); 
$found = false; 
foreach($yesterday as $yKey) 
{   
    $found = false; 
    foreach($today as $tKey) 
    { 
    if($tKey['name'] == $yKey['name']) 
    { 
     $found = true; 
     $stay[]['name'] = $tKey['name']; 
     break; 
    } 
    else 
    { 
     $found = false; 
    } 
    } 
    if($found == false) 
    { 
     $gone[]['name'] = $yKey['name']; 
    } 
} 

foreach($today as $tKey) 
{ 
    $found = false; 
    foreach($yesterday as $yKey){ 
    if($yKey['name'] == $tKey['name']) 
    { 
     $found = true; 
     break; 
    } 
    else{ 
     $found = false; 
    } 
    } 
    if($found == false) 
    { 
     $gone[]['name'] = $tKey['name']; 
    } 
} 
相關問題