多維我有一個數組,我想對它進行排序:排序陣列由第一子陣列
$ArrayStock = array(array("SIZE","L","XL","M"),("STOCK","12","3","2"));
我怎樣才能通過「大小」數組排序?
或者,我可以用這個數組爲出發點:
$ArrayStock = array(array("L","XL","M"),("12","3","2"));
多維我有一個數組,我想對它進行排序:排序陣列由第一子陣列
$ArrayStock = array(array("SIZE","L","XL","M"),("STOCK","12","3","2"));
我怎樣才能通過「大小」數組排序?
或者,我可以用這個數組爲出發點:
$ArrayStock = array(array("L","XL","M"),("12","3","2"));
將有幾種方法來剝皮這隻貓。我所有的方法會產生預期的輸出...
首先,讓我們做沒有重組的陣列(Demo):
$order=["XS","S","M","L","XL","2XL","3XL"]; // declare appropriate size order
$ArrayStock=[["L","XL","M"],["12","3","2"]];
// Order the first subarray:
uasort($ArrayStock[0],function($a,$b)use($order){
return (array_search($a,$order)>array_search($b,$order)?1:-1); // any unidentifed sizes will go to the front
});
// Sync the second subarray with first subarray:
$ArrayStock[1]=array_replace($ArrayStock[0],$ArrayStock[1]);
// Optionally re-index the keys:
$ArrayStock[0]=array_values($ArrayStock[0]);
$ArrayStock[1]=array_values($ArrayStock[1]);
接下來,我將展示的幾種方法你可以操縱一個重組數組。 trincot編寫他的方式絕對沒有錯。這些只是我已經提出的替代方案...
我同意trincot關於使用尺寸作爲關鍵字(因爲它們將是唯一的)和股票作爲價值計數。因此,第一個過程是生成新的數組結構:
$ArrayStock=[["L","XL","M"],["12","3","2"]];
#1一襯墊array_combine()
的方法:
$new_structure=array_combine($ArrayStock[0],$ArrayStock[1]);
// $new_structure = ['L'=>'12','XL'=>'3','M'=>'2']
#2foreach()
方法:
foreach($ArrayStock[0] as $i=>$size){
$new_structure[$size]=$ArrayStock[1][$i];
}
// $new_structure = ['L'=>'12','XL'=>'3','M'=>'2']
現在到了新的數組排序,你可以使用uksort()
或者一系列其他陣列功能與預定的順序排列/循環:
$order=["XS","S","M","L","XL","2XL","3XL"]; // declare whatever appropriate sizes in order
#1uksort()
與array_search()
方法:
uksort($new_structure,function($a,$b)use($order){
return (array_search($a,$order)>array_search($b,$order)?1:-1);
// any unidentified sizes will go to the front of the array
});
// keep in mind, this doesn't declare $result, it sorts $new_structure
#2array_replace()
與array_flip()
- array_intersect()
- array_keys()
方法:
$result=array_replace( // replace values on matching keys
array_flip( // swap keys with values
array_intersect(
$order, // keep values from here
array_keys($new_structure) // that exist here
)
),
$new_structure); // use these elements for replace
// $result=['M'=>'2','L'=>'12','XL'=>'3'];
#3foreach()
與array_intersect()
- array_keys()
方法:
// generate & iterate ordered array
foreach(array_intersect($order,array_keys($new_structure)) as $v){
$result[$v]=$new_structure[$v]; // build properly sorted array
}
// $result=['M'=>'2','L'=>'12','XL'=>'3'];
最後的trincot已經表明,你可以恢復排序的數據恢復到初始格式多一個單襯裏:
$ArrayStock=[array_keys($result),array_values($result)];
@亨吉斯坦對不起,這個冗長的回答。大多數情況下,只需使用我開始的兩步法即可,也可以重構數組並使用許多技術中的任何一種對數據進行排序。我主要想用你的問題來教育讀者。讓我知道是否有什麼不適合你,或者如果你不明白我寫的東西。 – mickmackusa
我非常感謝complate教程$ ArrayStock @mickmackusa,我嘗試和它爲我工作。 –
@亨吉斯特我的榮幸是我的。我總是通過實驗/教學來學習更多。 – mickmackusa
你可以做這樣的:
// Combine into one associative array
$combined = array_combine($ArrayStock[0], $ArrayStock[1]);
// Rebuild it in the correct order:
foreach(["SIZE", "S","M","L","XL","XXL"] as $size) {
if (isset($combined[$size])) $result[$size] = $combined[$size];
}
// Split associative array back to its original structure:
$ArrayStock = [array_keys($result), array_values($result)];
注意,這種結構是不是在它的使用如此的實用。實際上我會堅持使用關聯數組。
你不能,因爲對某些stupi d原因「大小」是你的數組的一部分,而不是一個鍵 –
好吧,如果我刪除「大小」和「股票」如何排序?所以像這樣$ ArrayStock = array(array(「L」,「XL」,「M」),(「12」,「3」,「2」)); –
使聯想 – Thielicious