如何对多个mysql foreach数组进行排序,并在php中保持一致?

如何对多个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

我正在尝试按计算值对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>";
}

?>
<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>