如何对多个 mysql foreach 数组进行排序并需要它们在 php 中保持一致?
Posted
技术标签:
【中文标题】如何对多个 mysql foreach 数组进行排序并需要它们在 php 中保持一致?【英文标题】:How can I sort multiple mysql foreach arrays and need them in consistent in php? 【发布时间】:2015-05-08 09:33:53 【问题描述】:我正在尝试按我的计算值对 mysql 数据进行排序。我知道 rsort(), sort(),但是,我不能在 foreach 之外对它们进行单独排序,因为它不会是一致的。当我只想按百分比对它们进行排序时,我有三个数组需要保持一致。我怎样才能做到这一点?欣赏。
<?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>";
?>
【问题讨论】:
对第一个进行排序,从中获取键列表,然后使用 array_multisort() 根据该组键对其他两个数组进行排序 【参考方案1】:保持三个数组之间的连接的一种方法是使用关联数组。如果成员 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>";
?>
如果成员 id 可以在结果集中多次出现,则只需实例化一个变量,例如示例中的 $unique_id
,并随每个结果递增,并将其用作所有三个数组的索引,而不是$member_id
.
或者,如果您只想显示前几个结果,并且想要维护完整的$combine_count
数组以供以后使用,您也可以这样做:
arsort($combine_count); // maintain index, descending order
// loop over $combine_count array
$cc = 0; // start counter
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>";
$cc++; // increment counter
if ( 7 <= $cc ) break; // break out of loop if counter is greater than or equal to 7
您的代码中是否缺少一些$
s,尤其是row
?我添加了我认为他们丢失的地方。看起来您缺少 $user_avatar
数组。还是我错过了什么?
【讨论】:
非常感谢。是的,当我粘贴代码时,我可能会错过那些。虽然我不太了解唯一 ID 部分,但数组中的 member_id 可以实现我所需要的有多神奇,它可以按我的预期工作。再次感谢。但是切片数组不起作用,我不知道为什么。它切成 7 个部分。 7个div,但只有三个div显示数据,我通过在语句部分设置限制来修复这部分,但只是想知道为什么切片数组不起作用。再次感谢 不客气。很高兴您指出了array_slice
的问题。我没有包含必要的“维护索引”标志作为函数的最后一个参数。我修复了上面的示例,现在它可以正确切片了!【参考方案2】:
为什么还要使用三个单独的数组?创建一个数组,该数组与您的三个值具有关联结构。然后使用usaort 按您喜欢的顺序对您的值进行排序。
所以,而不是
$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
。如果您创建自定义类而不是我的关联数组,则可以加分。
或者,甚至更好的选择:在您的数据库中执行所有操作(计算、排序)。
概念验证代码:
<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>
【讨论】:
感谢您的宝贵时间。但我不知道如何将 user_link 与 $data[] 分开并使用 uasort。如果你能提供一个例子,那就太好了。无论如何,仍然感谢您的帮助。 好的,我已经更新了我的答案并提供了概念验证代码。希望它足够清楚。以上是关于如何对多个 mysql foreach 数组进行排序并需要它们在 php 中保持一致?的主要内容,如果未能解决你的问题,请参考以下文章
如何形象地解释 JavaScript 中 map,foreach,reduce 间的区别