[PHP] Nähere Zahl suchen

06/17/2014 14:37 Devsome#1
Hallo epvp,

habe jetzt grad irgendwie ein Problem und komme nicht auf die Lösung.
Ich habe einen Wert z.B. (16:25:04) und versuche die Nächst liegende in der Datenbank zu finden.

Die Werte sehen in der Datenbank wie folgt aus (15:87:21 , 18:26:01 , 84:10:15)
Nie Größer als 100:100:26

Hoffe ich habe es verständlich ausgedrückt.

Code:
$qWerte = sprintf("SELECT * FROM TB_Werte WHERE Name='ul'");
$rWerte = mysql_query($qWerte);

$a1 = array();
$a2 = array();
$a3 = array();

while ($row= mysql_fetch_assoc($rWerte)) {
	$aKoordUL = explode(":",$row['Koordinaten']);
	array_push($a1,(int)$aKoordUL[0]);
	array_push($a2,(int)$aKoordUL[1]);
	array_push($a3,(int)$aKoordUL[2]);
}
asort($a1);
asort($a2);
asort($a3);
Hier mal etwas, was ich im Internet gefunden habe. Nur Leider stimmt das überhaupt nicht überein.

Code:
$GLOBALS['steps'] = 0;

$iKoord = "16:8:23";		
$array = explode(":",$iKoord);


echo findClosest((int)$array[0], $a1, 0, count($a1)-1), "\n";
echo "steps: {$GLOBALS['steps']}"; 

function findClosest($needle, $numbers, $from, $to){    
	$GLOBALS['steps']++; 
	
	$p = ($from + $to)/2;
	$ceil = ceil($p);    
	$floor = floor($p);    
	
	if ($from == $floor || $to == $ceil){
		 $d1 = abs($needle - $numbers[$floor]);
		 $d2 = abs($needle - $numbers[$ceil]);

		if($d1 < $d2){
			return $numbers[$floor];
		}
		else{
			return $numbers[$ceil];
		}        
	}    
	elseif ($numbers[$floor] > $needle) {
		return findClosest($needle, $numbers, $from, $floor);
	}
	else {
		return findClosest($needle, $numbers, $ceil, $to);        
	}
}
06/17/2014 18:17 'Heaven.#2
Falls es richtige 3D-Koordinaten sind, kannst du mittels Pythagoras die Distanz ermitteln und demnach vergleichen


[Only registered and activated users can see links. Click Here To Register...]
06/17/2014 19:32 Devsome#3
Quote:
Originally Posted by 'Heaven. View Post
Falls es richtige 3D-Koordinaten sind, kannst du mittels Pythagoras die Distanz ermitteln und demnach vergleichen


[Only registered and activated users can see links. Click Here To Register...]
Danke dir.

Muss jetzt nur noch in einem Array speichern welche Zahl am niedrigsten ist und diese dann jeweils ausgeben.

Code:
echo "Meine Koordinaten: " . (int)$array[0] . ":" .  (int)$array[0] . ":" .  (int)$array[0] . "<br>";
for ($i = 1; $i <= count($a1); $i++) {
	echo sqrt(pow(($a1[$i] - (int)$array[0]),2) + pow(($a2[$i] - (int)$array[1]),2) + pow(($a3[$i] - (int)$array[2]),2)) . " => Koordinaten zum Vergleich " . $a1[$i] . ":" . $a2[$i] . ":" . $a3[$i] . "<br>" ;
}
06/17/2014 19:59 'Heaven.#4
Code:
 static Opponent GetClosestTarget()
                {
                    var possibleShips = _opponents.Where(s => s.Company != 0 /*&& s.Company != _hero.FractionId*/).ToList();
                    Opponent ret = null;
                    if (possibleShips.Count > 0)
                    {
               
                        if (possibleShips.Count == 1)
                        {
                            ret = possibleShips[0];
                        }
                        else
                        {
                            ret = possibleShips[0];
                            double dist = _getDistance(_hero.X, _hero.Y, ret.X, ret.Y);

                            foreach (var x in possibleShips)
                            {
                                double d = _getDistance(_hero.X, _hero.Y, x.X, x.Y);
                                double com = Math.Min(dist, d);
                                if (com != dist)
                                {
                                    ret = x;
                                    dist = d;
                                }
                            }

                        }

                
                    }
                    return ret;
                }

Eventuell hilft dir ja dies
06/17/2014 20:47 Devsome#5
Habe trozdem noch irgendwie ein Problem bzw. gefällt mir die Ausgabe nicht.

Kann ich den return Wert nicht irgendwie Speichern und weiter unten einzelnd ausgeben lassen ?
z.B.
Code:
$data = $api->findClosest($_POST['spielername'];

//weiter unten

echo $data[0][0];
Code:
if ($_POST['findClosest']){
	if(empty($_POST['spielername']))
	{
		$Information = "<p>Bitte geben Sie einen Spieler ein</p>";
	}else{
		$Information = "<p>Gefunden: ";
		foreach($api->findClosest($_POST['spielername']) as $key=>$value)
		{
			$Information .= " [" . $key . "] ".$value;
		}
		$Information .= "</p>";
	}
}
Code:
public static function findClosest($spielerName){
	$getPlayerID = sprintf("SELECT ID FROM TB_DatenPlayer WHERE Spieler='" . mysql_real_escape_string($spielerName) . "'");
	$playerID = mysql_query($getPlayerID);
	while($varID = mysql_fetch_array($playerID))
	{
		$finalID = $varID['ID'];
	}
	
	$getPlayerI = sprintf("SELECT Koordinaten FROM TB_DatenKoo WHERE ID='" . $finalID . "'");
	$playerKoord = mysql_query($getPlayerI);
	while($varInseln = mysql_fetch_array($playerKoord))
	{
		$finalInseln = $varInseln['Koordinaten'];
	}

	$array = explode(":",$finalInseln);
	
	$qWerte = sprintf("SELECT * FROM TB_DatenKoo WHERE Koordinaten='ul'");
	$rWerte = mysql_query($qWerte);
	
	$a1 = array();
	$a2 = array();
	$a3 = array();
	
	while ($row = mysql_fetch_assoc($rWerte)) {
		$aKoordUL = explode(":",$row['Koordinaten']);
		array_push($a1,(int)$aKoordUL[0]);
		array_push($a2,(int)$aKoordUL[1]);
		array_push($a3,(int)$aKoordUL[2]);
	}
	asort($a1);
	asort($a2);
	asort($a3);
	
	$a4 = array();
	for ($i = 1; $i <= count($a1)-1; $i++) {
		$varAbstand =  round(sqrt(pow(($a1[$i] - (int)$array[0]),2) + pow(($a2[$i] - (int)$array[1]),2) + pow(($a3[$i] - (int)$array[2]),2)), 3);
		$zwischenWerte["Abstand"] 	= $varAbstand;
		$zwischenWerte["Lange"] 		= $a1[$i];
		$zwischenWerte["Breite"] 		= $a2[$i];
		$zwischenWerte["Punkt"] 		= $a3[$i];
		array_push($a4,$zwischenWerte);
	}
	$min = min($a4);
	return $min;
}
06/19/2014 14:32 Devsome#6
^niemand eine Idee ?
06/19/2014 14:42 tolio#7
Quote:
Originally Posted by Devsome View Post
Kann ich den return Wert nicht irgendwie Speichern und weiter unten einzelnd ausgeben lassen ?
packs einfach in ne variable rein und gibts später aus, wo ist das problem?
06/19/2014 14:45 Devsome#8
Quote:
Originally Posted by tolio View Post
packs einfach in ne variable rein und gibts später aus, wo ist das problem?
:facepalm: ich stande irgendwie auf dem Schlauch. Danke