Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 排序数组工作不正常_Php - Fatal编程技术网

Php 排序数组工作不正常

Php 排序数组工作不正常,php,Php,按字母顺序排列的数组未正确输出 它输出为: 演示 qwerty 演示3 测试1 测试2 新1 而不是: 演示 演示3 新1 qwerty 测试1 测试2 代码: 不要使用sortarray函数,只需使用以下命令: asort($dbresults) 不需要重新发明轮子。阅读相关内容您的问题在于: function sortarray($a, $b) { return strcmp($a["cb_boutiquename$i"], $b["cb_boutiquename$i"]); }

按字母顺序排列的数组未正确输出

它输出为:

演示 qwerty 演示3 测试1 测试2 新1

而不是:

演示 演示3 新1 qwerty 测试1 测试2

代码:


不要使用
sortarray
函数,只需使用以下命令:

asort($dbresults)


不需要重新发明轮子。阅读相关内容

您的问题在于:

function sortarray($a, $b) {
    return strcmp($a["cb_boutiquename$i"], $b["cb_boutiquename$i"]);
}
$i是未定义的,因此基本上是将一个未定义的数组偏移量与另一个进行比较

如果您想指定在运行时指定哪一个cb_name字段,那么您可能需要在函数中包含$i,在php上,这可以通过返回闭包的函数(PHP5.3+)来完成

这将返回一个函数,该函数关闭提供的参数,适合用作usort的比较函数。因此,对于您的分拣呼叫,您将使用:

usort($dbresults, getSorter(1));
或者,对于不在属性上使用cb_名称前缀的更通用的解决方案,您可以将其更改为

function getSorter($idx){
       return function($a, $b) use ($idx) {
           return strcmp($a[$idx], $b[$idx]);
       };
}
usort($dbresults, getSorter("cb_boutiquename1"));
这将允许您按其中一个索引对任何数组进行排序

更新 我完全误解了这个练习的目的。您要做的是在进行任何排序之前展平数组

    $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";
}
$dbresults=array(“0”=>array(“id”=>“1”,
“cb_名称1”=>“测试1”,
“cb_2”=>“测试2”,
“cb_精品店名称3”=>“新1”
),
“1”=>数组(“id”=>“2”,
“cb_精品店名称1”=>“演示”,
“cb_精品名称2”=>“qwerty”,
“cb_精品店名称3”=>“演示3”
)
);
//展平阵列
$results=array();
foreach($dbresults为$k=>$v){
foreach($v作为$key=>$value){
if(substr($key,0,15)=“cb_名称”){
$results[]=array(“id”=>$v[“id”],“cbu名称”=>$value,“i”=>substr($key,15));
}
}
}
usort($results,function($a,$b){return strcasecmp($a[“cbu精品名称”],$b[“cbu精品名称”];});
foreach($results作为$result){
回显“
”。“\n”; }
另外,$I超出了sortarray()函数的作用域。sort()不保留数组索引。而且不必为usort()费心,我取代了usort($dbresults,“sortarray”);带asort($dbresults);但它没有正确地对它们进行排序。它给出了:Test1 Test2 New1 Demo qwerty demo3是的,但是想法是用
asort($dbresults)更改整个
sortarray
函数。。。没有必要构建一个新函数来完成PHP已经为自己做的事情。。。在我放在答案上的文档链接中,有几个例子解释了如何使用它。@Greystoke您使用的是PHP5.3或更高版本吗?@Graystoke抱歉。。。我意识到我忘记了return语句后的分号,更新了答案以反映这一点。它现在输出:Demo qwerty Demo3 Test1 Test2 new1我完全误解了你的问题…你需要在进行任何排序之前展平数组。我将发布一个解决方案。谢谢。cb_精品名称在数组中上升到cb_精品名称30。我是否需要为每个cb_名称添加一行。比如:$results[]=array(“id”=>$v[“id”],“cb_精品名称”=>v[“cb_精品名称30”],“i”=>3);
function getSorter($idx){
       return function($a, $b) use ($idx) {
           return strcmp($a[$idx], $b[$idx]);
       };
}
usort($dbresults, getSorter("cb_boutiquename1"));
    $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";
}