我有兩個陣列,一個包含原始資料,另一個包含相同的條目但順序新。
如何對原始陣列進行排序,以便僅移動新訂單陣列中指定的專案?
原始陣列:
[
['tabelle_mannschaft' => 'SV Winter'],
['tabelle_mannschaft' => 'Mannschaft 7'],
['tabelle_mannschaft' => 'TSV HORIZONT'],
['tabelle_mannschaft' => 'Mannschaft 8'],
]
新訂單陣列:
[
['tabelle_mannschaft' => 'TSV HORIZONT'],
['tabelle_mannschaft' => 'Mannschaft 7'],
]
因此,在上述情況下,我需要原始陣列,但專案 [1] 和 [2] 已切換。
期望的結果:
[
['tabelle_mannschaft' => 'SV Winter'],
['tabelle_mannschaft' => 'TSV HORIZONT'],
['tabelle_mannschaft' => 'Mannschaft 7'],
['tabelle_mannschaft' => 'Mannschaft 8'],
]
為清楚起見,兩個陣列都可以包含多于 2 或 3 個條目。
uj5u.com熱心網友回復:
您可以逐步遍歷原始陣列,并根據您的排序陣列檢查每個元素:
- 如果未找到,則轉到原始陣列中的下一個元素
- 如果找到
- 如果它在第一個位置,將其從排序陣列中洗掉,移動到原始陣列中的下一個元素
- 否則從原始陣列中的當前位置洗掉元素并將其附加到末尾,移動到原始陣列中的下一個元素
假設:
- 排序陣列中的所有元素僅在原始陣列中出現一次
uj5u.com熱心網友回復:
為了快速檢查排序子集中是否存在給定行,請填充查找陣列。
如果查找陣列中存在遇到的 tabelle_mannschaft 值,則將當前行替換為子集中的第一行。
存在可能導致損壞的邊緣情況(例如重復值),但樣本資料并未表明非唯一 tabelle_mannschaft 值的可能性。
代碼:(演示)
$lookup = array_column($subset, 'tabelle_mannschaft', 'tabelle_mannschaft');
foreach ($array as $i => $row) {
if (isset($lookup[$row['tabelle_mannschaft']])) {
$array[$i] = array_shift($subset);
}
}
var_export($array);
或者,如果可以信任子集來保存正確/完整的行資料,則可以使用 null 合并運算子寫入每一行。(演示)
$lookup = array_column($subset, null, 'tabelle_mannschaft');
foreach ($array as &$row) {
$row = $lookup[$row['tabelle_mannschaft']] ?? array_shift($subset);
}
var_export($array);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/529490.html
