我有一個按隨機順序給予我的數組。該數組是一個數組數組,我給出了一個命令來根據每個子數組中存在的一個鍵來放置數組。例如,我給出的數組array(array('id' => 1), array('id' => 2))
。我被告知根據每個子數組的鍵'id'以(2,1)的順序排列數組。用已知順序對陣列進行重新排序的最有效方式
什麼是在PHP中這樣做的最有效的方法?
我有一個按隨機順序給予我的數組。該數組是一個數組數組,我給出了一個命令來根據每個子數組中存在的一個鍵來放置數組。例如,我給出的數組array(array('id' => 1), array('id' => 2))
。我被告知根據每個子數組的鍵'id'以(2,1)的順序排列數組。用已知順序對陣列進行重新排序的最有效方式
什麼是在PHP中這樣做的最有效的方法?
PHP允許你編寫自己的排序函數。我不能保證此解決方案的效率,但它會起作用並直接受到語言的支持,所以我喜歡它。
對於你的情況,你會寫是這樣的:
function custom_sort_by_id($a, $b) {
// If the two IDs are the same, no sorting should be done
if ($a['id'] == $b['id']) {
return 0;
}
return ($a['id'] < $b['id']) ? -1 : 1;
}
你可以這樣調用該函數如下:
usort($myarray, "custom_sort_by_id");
因此,例如,如果您有以下起始數組:
array(3) {
[0]=>
array(2) {
["id"]=> int(3)
["value"]=> int(1)
}
[1]=>
array(2) {
["id"]=> int(2)
["value"]=> int(2)
}
[2]=>
array(2) {
["id"]=> int(1)
["value"]=> int(3)
}
}
您會收到以下結果:
array(3) {
[0]=>
array(2) {
["id"]=> int(1)
["value"]=> int(3)
}
[1]=>
array(2) {
["id"]=> int(2)
["value"]=> int(2)
}
[2]=>
array(2) {
["id"]=> int(3)
["value"]=> int(1)
}
}
好吧,最快的方法是創建另一個相同大小的數組,通過隨機數組循環並根據id放置它們。
這是假設ID是爲了(又名1至然而,許多有)
如果不是這樣的話,那麼你就需要遍歷他們陸續找到的最低值,要麼用另一個值交換它或將它移動到另一個臨時數組。
還有其他的事情要考慮,比如列表有多大,如果列表非常大,那麼你可以使用類似快速排序的東西,儘管對於較小的列表來說,像泡泡或插入排序只是工作精細。
我覺得最CPU效率(雖然沒有過多的內存使用效率)的方法是做2遍:
作出關聯數組對應的鍵:
foreach ($array as $item) $ids[$item['id']] = $item;
結構的結果在給定的順序:
foreach ($order as $id) $result[] = $ids[$id];
效率很大程度上取決於您將如何處理數據,因此這很難回答。最有效的方法是認識到PHP陣列是actually ordered maps,從一開始構建一個ID密鑰的陣列。還要注意的是,如果你需要將陣列放置在隨機順序定期排序功能將無法正常工作:
<?php
function add ($needle, &$haystack)
{
$haystack[$needle['id']] = $needle;
}
$map = array();
add (array('id' => 1), $map);
add (array('id' => 10), $map);
add (array('id' => 100), $map);
add (array('id' => 1000), $map);
add (array('id' => 10000), $map);
$order = array(1,10000,10,1000,100);
foreach ($order as $o)
print_r ($map[$o]);
http://php.net/usort – zerkms
的foreach($順序$ V)$結果[] = array('id'=> $ v);回答問題。 – Alfwed