按字母顺序排序数组无法正确输出。
输出为:
演示 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 :(得分:1)
你的问题在于:
function sortarray($a, $b) {
return strcmp($a["cb_boutiquename$i"], $b["cb_boutiquename$i"]);
}
$ i未定义,因此您基本上将一个未定义的数组偏移与另一个进行比较。
如果要指定在运行时指定哪个cb_boutiquename字段,那么你可能要做的是在函数中包含$ i,在php上可以使用返回闭包的函数来完成(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"));
这将允许您通过其中一个索引对任何数组数组进行排序。
<强>更新强> 我完全误解了这个练习的目标。你想要做的是在进行任何排序之前弄平你的阵列。
$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";
}
答案 1 :(得分:0)