我有一個這樣的數組:PHP如何根據優先級順序對一個對象數組進行排序並按字母順序進行備份?
$sort_me = array(
array("file"=>"Desert.jpg"),
array("file"=>"Hello.jpg"),
array("file"=>"Test.jpg)
)
我要排序根據文件屬性按字母順序此陣。複雜的事情,我有一個可選的陣列:
$sort_order = array("Test.jpg", "Hello.jpg", "NotFound.jpg")
此數組將指定一些用戶定義的排序。這些數組元素具有優先權,並且如果發現它們將按照該順序放置。其他不符合$sort_order
中任何內容的元素應按字母順序排列在數組末尾。
在JavaScript中,我將使用調用帶有比較函數的排序函數,該函數接受2個元素並返回一個數字,以將第一個對象放在第二個對象的前面或後面。
我該怎麼用PHP做到這一點?
編輯
我嘗試的東西,它沒有工作。 (再次修改把邏輯成一個函數,並且通過概括排序其中字段)
<?php
function sort_priority($sort_me, $sort_order, $field) {
function compare($a, $b) {
if ($sort_order) {
$ai = array_search($a[$field], $sort_order);
$bi = array_search($b[$field], $sort_order);
if ($ai !== false && $bi === false) {
return -1;
} else if ($bi !== false && $ai === false) {
return 1;
} else if ($ai !== false && $bi !== false) {
return $bi - $ai;
}
}
return $a[$field] < $b[$field] ? -1 : 1;
}
usort($sort_me, "compare");
}
$sort_order = array("Test.jpg", "Hello.jpg", "NotFound.jpg");
$sort_me = array(
array("file"=>"Test.jpg"),
array("file"=>"Desert.jpg"),
array("file"=>"Hello.jpg")
);
sort_priority($sort_me, $sort_order, "file");
echo json_encode($sort_me);
?>
此輸出
Notice: Undefined variable: sort_order in c:\workspace\test.php on line 10
預期的輸出是
[{"file":"Test.jpg"},{"file":"Hello.jpg"},{"file":"Desert.jpg"}]
我不知道如何獲取compare
函數以正確使用上下文特定的$sort_order
函數。
編輯
我接受一個答案,但我完整性想發佈的東西,我終於結束了,似乎工作。如果有人想發佈更優雅的解決方案,我會考慮將其標記爲已接受。但這裏是我所擁有的:
<?php
function compare_priority($a, $b) {
global $g_order, $g_field;
if ($g_order) {
$ai = array_search($a[$g_field], $g_order);
$bi = array_search($b[$g_field], $g_order);
if ($ai !== false && $bi === false) {
return -1;
} else if ($bi !== false && $ai === false) {
return 1;
} else if ($ai !== false && $bi !== false) {
return $ai - $bi;
}
}
return $a[$g_field] < $b[$g_field] ? -1 : 1;
}
function sort_priority(&$sort_me, $sort_order, $field) {
global $g_order, $g_field;
$g_order = $sort_order;
$g_field = $field;
usort($sort_me, "compare_priority");
}
$sort_me = array(
array("file"=>"Z"),
array("file"=>"A"),
array("file"=>"Y"),
array("file"=>"B")
);
$sort_order = array("Z", "Y", "C");
sort_priority($sort_me, $sort_order, "file");
echo json_encode($sort_me);
?>
閱讀[排序()](http://php.net/sort),[usort()](HTTP文件:/ /php.net/usort)和派生。 – ComFreek
所以你希望'$ sort_me'數組按以下順序排序:Test.jpg,Hello.jpg,...,Desert.jpg,... –
可能的重複[參考:對數組進行排序的所有基本方法和數據在PHP](http://stackoverflow.com/questions/17364127/reference-all-basic-ways-to-sort-arrays-and-data-in-php) – deceze