2013-08-22 122 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