2013-08-22 120 views
0

按字母順序對數組進行排序無法正確輸出。排序陣列無法正常工作

它輸出作爲:

演示 QWERTY Demo3 測試1 的Test2 NEW1

代替:

演示 Demo3 NEW1 QWERTY 測試1 的Test2

代碼:

<?php 

$dbresults= array ("0" => array ("id" => "1", 
           "cb_boutiquename1" => "Test1", 
           "cb_boutiquename2" => "Test2", 
           "cb_boutiquename3" => "New1" 
           ), 
       "1" => array ("id" => "2", 
           "cb_boutiquename1" => "Demo", 
           "cb_boutiquename2" => "qwerty", 
           "cb_boutiquename3" => "Demo3" 
           ) 
      ); 

    function sortarray($a, $b) { 
     return strcmp($a["cb_boutiquename$i"], $b["cb_boutiquename$i"]); 
    } 

    usort($dbresults, "sortarray"); 

    while (list($key, $value) = each($dbresults)) { 
     $results[] = $value ; 
    } 

    foreach($results as $result) { 
     $i = 1; 
     while (array_key_exists("cb_boutiquename$i", $result)) { 
     if ($result["cb_boutiquename$i"] !='') { 
      echo '<a href=' . cbSef('index.php?option=com_comprofiler&task=page&user=' . (int) $result['id'] . '&b=' . $i . getCBprofileItemid(false)) . '>' . $result["cb_boutiquename$i"] . '</a><br />'; 
     } 
     ++$i; 
     } 
    } 
?> 
+0

http://php.net/manual/en/function.sort.php – Joum

+0

也http://php.net/manual/en/function.strcasecmp.php – Doon

+1

$ I超出範圍, sortarray()函數 –

回答

1

您的問題是在這裏:

function sortarray($a, $b) { 
    return strcmp($a["cb_boutiquename$i"], $b["cb_boutiquename$i"]); 
} 

$我是不確定的,所以你基本上是一個比較不確定的數組相互錯開。

如果你想指定在運行時指定哪個cb_boutiquename字段,那麼你可能想要做的是在函數中包含$ i,這可以用一個函數返回一個閉包(PHP 5.3 +)。

function getSorter($idx){ 
     return function($a, $b) use ($idx) { 
      return strcmp($a["cb_boutiquename$idx"], $b["cb_boutiquename$idx"]); 
     }; 
} 

這將返回一個函數,該函數關閉所提供的參數,並適合用作usort的比較函數。因此,對於你那種叫你使用:

usort($dbresults, getSorter(1)); 

還是爲了更廣泛的解決方案,不承擔對性能cb_boutiquename前綴,你可以將其更改爲

function getSorter($idx){ 
     return function($a, $b) use ($idx) { 
      return strcmp($a[$idx], $b[$idx]); 
     }; 
} 
usort($dbresults, getSorter("cb_boutiquename1")); 

這將允許你進行排序其中一個索引的任何數組數組。

UPDATE 我完全誤解了這個練習的目標。你想要做的是在做任何分類之前將你的數組弄平。

$dbresults= array ("0" => array ("id" => "1", 
          "cb_boutiquename1" => "Test1", 
          "cb_boutiquename2" => "Test2", 
          "cb_boutiquename3" => "New1" 
          ), 
      "1" => array ("id" => "2", 
          "cb_boutiquename1" => "Demo", 
          "cb_boutiquename2" => "qwerty", 
          "cb_boutiquename3" => "Demo3" 
          ) 
     ); 

// flatten out the array 
$results = array(); 
foreach($dbresults as $k=>$v){ 
    foreach ($v as $key=>$value) { 
      if (substr($key, 0,15) == "cb_boutiquename"){ 
       $results[] = array("id"=>$v["id"], "cb_boutiquename"=>$value, "i"=>substr($key, 15)); 
      } 
    } 

} 

usort($results, function($a, $b){ return strcasecmp($a["cb_boutiquename"], $b["cb_boutiquename"]); }); 
foreach($results as $result){ 
    echo '<a href=' . cbSef('index.php?option=com_comprofiler&task=page&user=' . (int) $result['id'] . '&b=' . $result["i"] . getCBprofileItemid(false)). '>' . $result["cb_boutiquename"] . '</a><br />'."\n"; 
} 
+0

當我把你的代碼在它導致頁面不加載 – Greystoke

+0

@Greystoke你使用php 5.3或更高? – Orangepill

+0

@格雷斯托克對不起...我意識到我遺忘了分號後的分號,更新了答案以反映這一點。 – Orangepill

0

而不是你sortarray功能,使用簡單:

asort($dbresults);

無需推倒重來。閱讀關於它here

+0

我替換了usort($ dbresults,「sortarray」);與asort($ dbresults);但它沒有正確分類。它給了:Test1 Test2 New1 Demo qwerty Demo3 – Greystoke

+0

是的,但想法是改變你的_whole_'sortarray'函數與'asort($ dbresults);'...沒有必要建立一個新的功能來做PHP的東西已經爲自己做...在我提供的文檔鏈接中,有幾個例子解釋瞭如何使用它。 – Joum