考慮以下數組。他們代表了前5執行員工yesterday
和today
:如何比較數組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
:-)
這個評論是供@peter的答案,但我缺乏足夠的代表;注意array_intersect()和array_diff()在這個問題的範圍內是不夠的,因爲它們沒有正確計算*關聯*數組。 – smithbh