如何对多个mysql foreach数组进行排序,并在php中保持一致?
我正在尝试按计算值对mysql数据进行排序。我知道rsort(),sort(),但是,我不能在foreach之外单独对它们进行排序,因为它将不一致。当我只想按百分比对它们进行排序时,我有三个数组需要保持一致。我该怎么做?谢谢如何对多个mysql foreach数组进行排序,并在php中保持一致?,php,mysql,arrays,sorting,Php,Mysql,Arrays,Sorting,我正在尝试按计算值对mysql数据进行排序。我知道rsort(),sort(),但是,我不能在foreach之外单独对它们进行排序,因为它将不一致。当我只想按百分比对它们进行排序时,我有三个数组需要保持一致。我该怎么做?谢谢 <?php //certain mysql connection code hide because it's not relative to this question. foreach ($rows as row) { $member_id
<?php
//certain mysql connection code hide because it's not relative to this question.
foreach ($rows as row) {
$member_id=row['user_id'];
$count=row['count'];
$user_link[]=bp_core_get_user_domain( $member_id );
$user_displayname[]=bp_core_get_user_displayname( $member_id );
$combine_count[]=round(($count/$count_user_diff)*100);//calculate value
}//foreach
//how can I sort data here since I have three arrays together.
for ($i=0; $i<7; $i++){
echo "<a href='$user_link[$i]'><div>$user_avatar[$i]<ul>$combine_count[$i]</ul></div></a>";
}
?>
<pre>
<?php
$data = array();
// Dummy entries
$data[] = array(
'user_link' => '#',
'user_displayname' => "Name",
'combine_count' => 10
);
$data[] = array(
'user_link' => '#',
'user_displayname' => "Name",
'combine_count' => 100
);
$data[] = array(
'user_link' => '#',
'user_displayname' => "Name",
'combine_count' => 40
);
$data[] = array(
'user_link' => '#',
'user_displayname' => "Name",
'combine_count' => 1000
);
// Comparator function
function compare($a, $b) {
if($a == $b) {
return 0;
} else {
return $a['combine_count'] < $b['combine_count'];
}
}
// Print (before sorting)
print_r($data);
// Sort
uasort($data, 'compare');
// Print (after sorting)
print_r($data);
?>
</pre>
保持三个数组之间连接的一种方法是使用关联数组。如果成员id是唯一的,则将其用于每个数组的索引。例如:
<?php
// $unique_id = 0; // in case $member_id is not unique
foreach ($rows as $row) {
$member_id = $row['user_id'];
$count = $row['count'];
// use $member_id as index to align arrays
$user_link[$member_id]=bp_core_get_user_domain( $member_id );
$user_displayname[$member_id]=bp_core_get_user_displayname( $member_id );
//$user_avatar[$member_id]=bp_core_get_user_avatar( $member_id ); // missing avatar array?
$combine_count[$member_id]=round(($count/$count_user_diff)*100);
//$unique_id++;
}
arsort($combine_count); // maintain index, descending order
// $combine_count = array_slice($combine_count, 0, 7, true); // top 7
// slice array if you only want the top 7 as the question implies
// loop over $combine_count array
foreach ( $combine_count as $member_id => $c_count ) {
echo "<a href='$user_link[$member_id]'><div>$user_avatar[$member_id]<ul>$combine_count[$member_id]</ul></div></a>";
}
?>
您的代码中是否缺少一些$
s,尤其是行
?我补充了我认为他们失踪的地方。看起来您缺少了$user\u avatar
数组。还是我遗漏了什么?为什么要使用三个单独的数组?创建一个数组,该数组具有与三个值关联的结构。然后使用按您喜欢的顺序对值进行排序
因此,与其
$user_link[]=bp_core_get_user_domain( $member_id );
$user_displayname[]=bp_core_get_user_displayname( $member_id );
$combine_count[]=round(($count/$count_user_diff)*100);//calculate value
你用
$data[] = array(
'user_link' => bp_core_get_user_domain( $member_id ),
'user_displayname' => bp_core_get_user_displayname( $member_id ),
'combine_count' => round(($count/$count_user_diff)*100)
);
然后在$data
上使用uasort
。如果您创建自定义类而不是我的关联数组,则可以获得额外的积分
或者,更好的选择是:执行数据库中的所有操作(计算、排序)
概念验证代码:
首先排序,从中获取密钥列表,然后使用array_multisort()根据这组密钥对其他两个数组进行排序非常感谢。是的,当我粘贴代码时,我可能会错过这些。虽然我不太了解唯一ID部分,但数组中的成员ID可以实现我所需要的功能,这是多么神奇,正如我所期望的那样。再次感谢。但是切片阵列不起作用,我不知道为什么。它分为7个部分。7个div,但只有3个div显示数据,我通过在语句部分设置一个限制来修复这一部分,但我只想知道为什么切片数组不能工作。再次感谢您。我很高兴你指出了数组\u切片的问题。我未能将必要的“维护索引”标志作为函数的最后一个参数。我修复了上面的示例,现在它可以正确地切片了!谢谢你抽出时间。但我不明白如何将user_链接与$data[]分离并使用uasort。如果你能举个例子,那就太好了。无论如何,仍然感谢您的帮助。好的,我已经更新了我的答案并提供了概念验证代码。希望它足够清楚。
<pre>
<?php
$data = array();
// Dummy entries
$data[] = array(
'user_link' => '#',
'user_displayname' => "Name",
'combine_count' => 10
);
$data[] = array(
'user_link' => '#',
'user_displayname' => "Name",
'combine_count' => 100
);
$data[] = array(
'user_link' => '#',
'user_displayname' => "Name",
'combine_count' => 40
);
$data[] = array(
'user_link' => '#',
'user_displayname' => "Name",
'combine_count' => 1000
);
// Comparator function
function compare($a, $b) {
if($a == $b) {
return 0;
} else {
return $a['combine_count'] < $b['combine_count'];
}
}
// Print (before sorting)
print_r($data);
// Sort
uasort($data, 'compare');
// Print (after sorting)
print_r($data);
?>
</pre>