2014-01-11 86 views
-1

我有一個這樣的數組: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); 
?> 
+2

閱讀[排序()](http://php.net/sort),[usort()](HTTP文件:/ /php.net/usort)和派生。 – ComFreek

+0

所以你希望'$ sort_me'數組按以下順序排序:Test.jpg,Hello.jpg,...,Desert.jpg,... –

+0

可能的重複[參考:對數組進行排序的所有基本方法和數據在PHP](http://stackoverflow.com/questions/17364127/reference-all-basic-ways-to-sort-arrays-and-data-in-php) – deceze

回答

1

您可以像使用javascript一樣完成此操作。 usort(http://ch2.php.net/manual/en/function.usort.php)允許您定義元素之間的自定義比較。

我修改您的代碼,它似乎工作:

<?php 
    function test() { 
     $sort_me = array(
      array("file"=>"Test.jpg"), 
      array("file"=>"Desert.jpg"), 
      array("file"=>"Hello.jpg") 
     ); 
     global $sort_order; 
     $sort_order = array("Test.jpg" , "Hello.jpg", "NotFound.jpg"); 
     function compare($a, $b) { 
      global $sort_order; 
      if (is_array($sort_order)) { 
       $ai = array_search($a["file"], $sort_order); 
       $bi = array_search($b["file"], $sort_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["file"] < $b["file"] ? -1 : 1; 
     } 
     usort($sort_me, "compare"); 
     echo json_encode($sort_me); 
    } 

    test(); 
?> 
+0

我是PHP新手,能否提供一個代碼示例?可調用函數如何引用'$ sort_order'數組? – codefactor

+0

我用一個代碼示例修改了我的帖子,嘗試瞭解決方案,它演示了我使用'usort'函數的問題。 – codefactor

+0

我修改了我的答案 –

相關問題