如何对多个 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 中保持一致?的主要内容,如果未能解决你的问题,请参考以下文章

Hashtable一个键多个值 在遍历怎么做啊

如何形象地解释 JavaScript 中 map,foreach,reduce 间的区别

PHP / MYSQL 插入数组 Foreach 循环

具有多维数组的php foreach

使用PHP与2个foreach循环中的数组进行比较时如何获取迭代次数

如何在 PHP/Eclipse 中对 foreach 循环中从数组中拉出的自定义对象进行智能感知?