2016-08-04 13 views
2

Ich habe eine Tabelle, die drei Spalten ID, Punkte, Rang hat. Rechtzeitig aktualisiere ich Daten für alle Felder, so dass die Punkte auf und ab gehen, aber alte Ranglisten bleiben gleich, also versuche ich einen Weg zu finden, der jeder ID ihren würdigen Rang basierend auf den verdienten Punkten verleiht.Wie kann man mehrdimensionale Array-Werte mit einem anderen Multi-Array vergleichen und Bulk-Daten abhängig von den Ergebnissen mit PHP und MySQLi aktualisieren?

Ich habe mehr als 2000 Zeilen in dieser Tabelle. Ich möchte es in php5 + mit mysqli machen? Ich denke, ich habe eine Lösung, aber es Timeout auch mit 1200 Sekunden Timeout-Einstellung und Speicher wird erschöpft.

Ich denke, dass meine Lösung genau funktioniert, aber jede der Schleifen braucht einen Arzt. Hier ist mein grobes Ziel ist ‚update‘ Abfrage genau zu gehen, dass alle Punkte in desc Reihenfolge nimmt und Auszeichnungen id ein Rang gegen die verdienten Punkte:

<?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++; 
} 
?> 
+0

Willkommen bei Stack Overflow! Bitte korrigieren Sie den Einzug Ihres Codes. – valignatev

+0

hat den Einzug behoben. Ich vermute! Jetzt hilf mir Geeks! – Unknown

+1

ehrlich gesagt mit aproach und kommentare wie diesem können sie hier keine antworten erhalten. – Zmrzka

Antwort

2

Ich habe meine ursprüngliche Antwort mit viel schlanker und kürzer Code ersetzt, können Sie natürlich Änderung in den Rang Zähler umfassen, wenn aufeinanderfolgende Benutzer gleichen Punkte haben, aber Sie können diese Zahl selbst

Dieser Code haben nur eine Schleife und Speicher und Ihre DB als auch

<?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 
} 
?> 
+0

Yo! Mann. Freut mich, einen Engel wie dich zu haben. Es ist cool und effizient. Ich muss sagen Perfekt. Danke nochmal Du bist mein GURU jetzt. – Unknown

0

Kürzlich durch gleiche Art von Problem ging hin und fand eine einfache Lösung wie unten nach viel kämpfen. Ich würde gerne klarstellen, dass es auf Ihre Eingabe und das erwartete Ergebnis ankommt, die Sie in Ihrem Beitrag nicht erwähnt haben.

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

Bitte ersetzen Sie die Werte entsprechend beim Versuch! Danke fürs Lesen.

+0

Mein Ziel ist if ($ id == $ max ['points']) {dann rank = 1, wobei id = '$ id' das ist die ID, die wir gerade gefunden haben, wer zweite max Punkte hat, bekommt 2 Rang und so auf. Wenn Sie denken, dass Sie die Antwort kennen, dann bearbeiten Sie bitte meinen Code entsprechend und senden Sie ihn bitte zurück. – Unknown

+0

Haben Sie versucht - preg_match ('/"'.$ id.' "/ I ', json_encode ($ max [' points '])))? –

+0

Entschuldigung! Ich will dich nur nicht ärgern, aber ich weiß wirklich nicht, wo ich meinen Code ändern soll. Es gibt drei Arrays, eine hat Ranks, eine andere hat ID und die letzte hat Punkte IDs sind nicht notwendig zu verwenden, aber ich möchte max zu min Punkten rangieren 1 ++; vielleicht kann ich meine Frage nicht klar vermitteln. – Unknown

0

Die folgende Antwort Code nimmt alle Punkte und relevante ids und setzt hoch zu niedrig Reihen gegen hoch zu niedrig Punkte bzw. wird gespart wird. Es wird jedoch nicht denselben Rang für die gleiche Punkthalter-ID zugewiesen, da es bis zum Ende mit Rang + 1 weiterläuft. Das könnte gemacht werden, ist aber derzeit nicht erforderlich.

<?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/>"; 
} 
} 
?> 
+1

@halfer ja es ist und der andere tut auch den Trick. – Unknown