2012-06-04 74 views
0

這些都沒有工作......(沒有排序)爲什麼這個php array_multisort沒有按預期工作?

我改編了這些來自PHP文檔網站的例子。

class ProductHelper { 

    function sortProductsByPrice($products, $sort = SORT_ASC) { 
     foreach ($products as $key => $row) { 
      $name[$key] = $row['name']; 
      $rrp[$key] = $row['rrp']; 
     }  
     array_multisort($rrp, $sort, $name, SORT_ASC, $products); 
    } 

    function sortProductsByName($products, $sort = SORT_ASC) { 
     foreach ($products as $key => $row) { 
      $name[$key] = $row['name']; 
     } 
     array_multisort($name, $sort, $products); 
    } 

} 

這是如何我使用它:

 $products = $cur_prod_cat["products"]; // copy an array of products 
     $PRODUCT_HELPER->sortProductsByName($products); //sort it 

在你需要看的情況下,產品陣列看起來是這樣的:

Array (
    [0] => Array (
     [id] => 0 
     [name] => product name 
     [description] => product description 
     [price] => product price 
     [etc] => other attributes 
    ) 
    [1] => Array (
     [id] => 1 
     [name] => product name 
     [description] => product description 
     [price] => product price 
     [etc] => other attributes 
    ) 
) 

回答

1

您需要return $rrp在你的第一個和return $name在你的第二個,在你致電array_multisort後。

這是因爲該函數正在排序變量$rrp$name,而不是您最初傳遞給該函數的變量。

編輯:如果你只是想排序$products通過它的name數組值,完全是一個更好的方法如下:

function sort_name($a,$b) { 
    return strcmp($a['name'],$b['name']); 
} 

$products = $cur_prod_cat["products"]; 
usort($products,'sort_name'); 

它使用功能sort_name來確定放哪一個元素的數組中第一。

然後,您可以根據需要創建更多sort_{value}函數,只需更改其包含的字段值即可。

+0

但是,這隻會返回一列?另外,不要把$ products數組放在array_multisort函數中對$ products數組進行排序? – Ozzy

+0

如果你看看php.net函數的定義:'bool array_multisort(array&$ arr [,mixed $ arg = SORT_ASC [,mixed $ arg = SORT_REGULAR [,mixed $ ...]]])' - 這是第一個被引用並因此排序的變量,而不是其他值。 – Death

+0

好的。我也剛剛意識到最後一個參數被添加到通過公共密鑰進行排序。但是,如果我想對這些列進行排序,那麼返回一個完整的產品數組,這意味着我必須複製每一列,對它們進行排序,然後將它們粘在一起? – Ozzy

相關問題