我有一系列行,其中包含酒店不同日期的房間可用性。我需要過濾陣列以確定酒店在哪些日期沒有空缺。
$array = [
["room_id" => "1", "date" => "01-07-2022", "available" => "A"],
["room_id" => "2", "date" => "01-07-2022", "available" => "A"],
["room_id" => "1", "date" => "02-07-2022", "available" => "A"],
["room_id" => "2", "date" => "02-07-2022", "available" => "U"],
["room_id" => "1", "date" => "03-07-2022", "available" => "U"],
["room_id" => "2", "date" => "03-07-2022", "available" => "U"],
["room_id" => "1", "date" => "04-07-2022", "available" => "U"],
]
01-07-2022只有A條目,因此該日期有空缺。
02-07-2022hasA和Uentries,因此該日期有空缺。
03-07-2022只有U條目,因此該日期沒有空缺。
04-07-2022只有U,因此該日期沒有空缺。
預期結果顯示沒有空缺的日期::
[
[
"room_id" => "2",
"date" => "03-07-2022"
"available" => "U"
],
[
"room_id" => "1",
"date" => "04-07-2022"
"available" => "U"
],
]
我嘗試了以下方法:
foreach ($roomsArr as $room) {
if ($room['availability'] === 'U') {
$unavailable[] = $room;
}
else if ($room['availability'] === 'A') {
$available[] = $room;
}
}
foreach ($unavailable as $uv) {
foreach ($available as $av) {
if ($av['date'] === $uv['date']) {
if ($av['availability'] === 'A' && $uv['availability'] === 'A') {
}
else if ($av['availability'] === 'A' && $uv['availability'] === 'U') {
}
else if ($av['availability'] === 'U' && $uv['availability'] === 'U') {
$arr1[] = $av;
}
}
}
}
uj5u.com熱心網友回復:
我將展示兩種具有不同好處的方法/片段。
首先將它們分成空陣列和非空陣列,然后按日期對這兩個陣列中的資料進行分組,這樣每個日期就不會有重復的條目。
資料分離和分組后,您只需將沒有空缺的日期/鍵與有空缺的日期進行比較。剩下的將是酒店沒有空房的日期。
這可能更容易概念化,但不會像第二個片段那樣高效,因為它執行兩種獨立的迭代技術。
代碼:(演示)
$hasVacancy = [];
$hasNoVacancy = [];
foreach ($array as $row) {
if ($row['available'] === 'A') {
$hasVacancy[$row['date']] = $row;
} else {
$hasNoVacancy[$row['date']] = $row;
}
}
var_export(
array_values(array_diff_key($hasNoVacancy, $hasVacancy))
);
輸出:
array (
0 =>
array (
'room_id' => '2',
'date' => '03-07-2022',
'available' => 'U',
),
1 =>
array (
'room_id' => '1',
'date' => '04-07-2022',
'available' => 'U',
),
)
更有效的是,您需要維護一個查找陣列以確保日期沒有可用房間。如果你能理解邏輯,我推薦這個片段。它只需要遍歷輸入陣列一次。
代碼:(演示)
$hasVacancy = [];
$result = [];
foreach ($array as $row) {
if ($row['available'] === 'A') {
$hasVacancy[$row['date']] = $row; // store available as reference
unset($result[$row['date']]); // remove potentially stored unavailable row for date
} elseif (!isset($hasVacancy[$row['date']])) {
$result[$row['date']] = $row; // is unavailable and no availables found
}
}
var_export(array_values($result));
// same result as previous snippet
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/483814.html
下一篇:陣列的表示
