【问题标题】:How to check one multi-dimensional array values against another multi-array and update bulk data depending on results, using PHP and MySQLi?如何使用 PHP 和 MySQLi 检查一个多维数组值与另一个多数组并根据结果更新批量数据?
【发布时间】:2016-12-10 22:00:59
【问题描述】:

我有一个包含三列 id、points、rank 的表。我及时更新了所有字段的数据,所以分数会上升和下降,但旧的排名保持不变,所以我试图找到一种方法,根据获得的分数赋予每个 id 其应得的排名。

我在这个表中有超过 2000 行。我想用 mysqli 在 php5+ 中做吗?我想我有一个解决方案,但即使设置了 1200 秒超时并且内存耗尽,它也会超时。

我认为我的解决方案可以正常工作,但任何循环都需要一些医生。在这里,我的粗略目标是“更新”查询以使其准确,该查询按 desc 顺序获取所有积分,并根据所获得的积分奖励 id 排名:

<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/includes/db.inc.php';


$a2= mysqli_query($link, "SELECT COUNT(*) as count FROM p1");
$b2 =mysqli_fetch_array($a2);
$count = $b2['count'];

$i=1;
while($i<=$count){
$a1= mysqli_query($link, "SELECT points FROM p1 ORDER BY points DESC LIMIT     $i");
if(!$a1){
echo mysqli_error($link);
}
while($po = mysqli_fetch_array($a1)){

$ross[] = $po; 
}   
foreach($ross as $pot){
$points=$pot['points'];
}  

$a5a= mysqli_query($link, "SELECT id FROM p1 WHERE points = '$points'");

while($popo = mysqli_fetch_array($a5a)){

$idi=$popo;
}  
foreach($idi as $idm){
$id=$idm['id'];

$rank = $i;
$update = mysqli_query($link,"UPDATE p1 SET rank = '$rank' WHERE points = '$points' AND id ='$id'");
}    
if(!$update){
echo "Error updating Rank".mysqli_error($link);
}  else {
echo "Succuessul for where id = '$id' and points = '$points' set rank = '$rank'<br/>";
}      
$i++;   
}  
?> 

【问题讨论】:

  • 欢迎来到 Stack Overflow!请修正代码的缩进。
  • 修复了缩进。我猜!现在帮助我的极客!
  • 坦率地说,像这样的方法和 cmets 你可能不会在这里收到任何答案。
  • 我希望你证明是错的,哈哈,但是是的!我完全同意你的看法,所以你能指出我应该去哪里或去看看吗?任何想法伴侣! Thanx 4 建议,很抱歉,但您的回答失败了。抱歉,根本不想打扰任何人。这个问题对我来说有点大,因为我是刚出生的婴儿,根本没有父母来编码。
  • @Zmrzka:你差点中了靶心!我复制并运行了您的代码,但它什么也没做,但是是的!你的代码给了我正确的方法来解决它。我已经修复了这个错误。 $rank++;这个想法比运行那些多余的循环要好得多。我也删除了不同的。只需使用 foreach 遍历所有点和 id,并在 foreach 中给出更新命令。就在 foreach $rank=0; 之前就在更新 $rank++ 之前;我的回声准确地告诉了代码在做什么。这该死的也很快。我的意思是代码。谢谢你的努力伙伴!呸!

标签: php mysql arrays mysqli


【解决方案1】:

我已经用更精简和更短的代码替换了我原来的答案,如果连续的用户有相同的分数,你当然可以包括对排名计数器的修改,但你可以自己解决这个问题

这段代码只有一个循环,同时也节省了内存和数据库

<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/includes/db.inc.php';
$a = mysqli_query($link, "SELECT id, points, rank FROM p1 ORDER BY points DESC ");    // lets get users in new ordering
$rank = 1;                                  // new ranks
while($line = mysqli_fetch_array($a)){
  if ($rank != $line["rank"]) {          //if old rank is different  we will hit db with new value
    echo "updating id ".$line["id"]." from rank ".$line["rank"]." to rank ".$rank." <br>";
    if(!mysqli_query($link,"UPDATE p1 SET rank = '".mysqli_real_escape_string($link,$rank)."' WHERE id ='".mysqli_real_escape_string($link,$line["id"])."'")) {
      echo "Error updating Rank".mysqli_error($link);
    }
  }else {  //if its the same we just leave the message for now
    echo "ignoring id ".$line["id"]." previous rank ".$line["rank"]." , new rank ".$rank." <br>";
  }
  $rank++;    // next user so lets increment the counter
}
?>

【讨论】:

  • 哟!人。很高兴有你这样的天使。它既酷又高效。我必须说完美。再次感谢你现在是我的 GURU。
【解决方案2】:

最近遇到了同样的问题,经过一番努力,找到了一个简单的解决方案,如下所示。我想澄清一下,这取决于您在帖子中未提及的输入和预期结果。

if (preg_match('/"'.<value>.'"/i' , json_encode(<your array>))) {
    echo "Match";
} else {
    echo "Doesn't match";
}

尝试时请相应地替换值!感谢阅读。

【讨论】:

  • 我的目标是if($id==$max['points']){ 然后rank =1,其中id='$id' 就是我们刚才匹配的id 那么谁有第二最大点数获得 2 级,依此类推。如果您认为您知道答案,请相应地编辑我的代码并将其发回。
  • 你试过了吗 - preg_match('/"'.$id.'"/i' , json_encode($max['points']))) ?
  • 对不起!只是不想惹恼你,但真的不知道在哪里更改我的代码。有三个数组,一个有排名,另一个有 id,最后一个有点 id 没有必要使用,但我想将 max 分配给 min points 排名 1 ++;也许我无法清楚地表达我的问题。
【解决方案3】:

下面的答案代码获取所有分数,以及相关的id,并分别设置从高到低的排名和从高到低的排名。但是,它不会为相同的积分持有者 id 分配相同的等级,因为它会一直以 Rank+1 滚动直到结束。可以这样做,但目前不需要。

<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/includes/db.inc.php';    //connection to the DB 
$a1= mysqli_query($link, "SELECT id, points FROM p1 ORDER BY points DESC"); //Selecting High to low all points 
if(!$a1){
echo mysqli_error($link);
}
while($po = mysqli_fetch_array($a1)) {                                                                                                                                            

$rose[] = $po;

}

$rank=0;//set rank 0

foreach($rose as $ro) { //splitting each row of array with unlimited rows

$points=$ro['points'];
$id=$ro['id'];

$rank++; //adding 1 each time foreach loops repeats itself until no row left
$update = mysqli_query($link,"UPDATE player1 SET rank = '$rank' WHERE points = '$points' AND id ='$id'"); //sending update command

if(!$update) { //echoing out what the hell this code is f******
echo "Error updating Rank".mysqli_error($link);
}  else {
echo "Succuessul for where id = '$id' and points = '$points' set rank = '$rank'<br/>";
} 
} 
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多