Aloha, ich habe nun schon was gebastelt und es ist ein Monster geworden. Aber es veranschaulicht was ich vorhabe und ich wüsste gerne ob es einfacher geht. Sollte auch deine Frage klären.
Folgende Funktion wird benötigt um zu prüfen ob ein Value im Multidimensionalen Array vorhanden ist:
function in_array_r($needle, $haystack, $strict = false) {
foreach ($haystack as $key => $item) {
if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
return $key;
}
}
return false;
}
Folgendes Array Muster dient als Grundlage:
$userids_using_same_ip[$ipadresss] = array("$userid1,$userid2 ....);
/**
Das wird nachher mein Array indem ich die Gruppen hinter dem sich ein und die selbe person verbiergt gespeichert wird.. Gruppen nenne ich Clouds:
**/
$sameuserandidcloud = array();
foreach($userids_using_same_ip as $ip => $userids) {
foreach($userids_using_same_ip[$ip] as $userid) {
// Hier habe ich die IP und die Userid
$checkip = in_array_r($ip, $sameuserandidcloud);
$checkuserid = in_array_r($userid, $sameuserandidcloud);
if($checkip==false && $checkuserid==false) {
//Neue Cloud erstellen
$cloundnr++;
if(!is_array($sameuserandidcloud[$cloundnr])) $sameuserandidcloud[$cloundnr] = array();
array_push($sameuserandidcloud[$cloundnr],$ip,$userid);
}
else {
if($checkip != false) array_push($sameuserandidcloud[$checkip],$ip,$userid);
elseif($checkuserid != false) array_push($sameuserandidcloud[$checkuserid],$ip,$userid);
}
}
}
Soweit so gut, ich habe hier nun schon das $sameuserandidcloud array vorbereitet und die werte sehen auch schon gut aus. Allerdings kann es passieren, da das array in der übergeordneten Schleife gebaut wird, dass IDs oder IPs obwohl sich später ein zusammenhang zeigen würde, in unterschiedliche clouds gespeichert werden. Daher muss ich das Array nochmal durchlaufen:
while($loop!=1) {
$break=0;
$loop=1;
foreach($sameuserandidcloud as $cloudid => $idanduseridarray) {
$break=0;
foreach($sameuserandidcloud[$cloudid] as $ipOrUserid) {
$check = in_array_r($ipOrUserid, $sameuserandidcloud);
if($check != false && $check != $cloudid) {
array_push($sameuserandidcloud[$check],$sameuserandidcloud[$cloudid][0]);
unset($sameuserandidcloud[$cloudid]);
$break = 1;
$loop = 0;
break;
}
}
if($break==1) break;
}
echo $break;
}
Ich laufe das Array praktisch durch und gucke ob eine Userid oder eine IP in einem anderem Cloudarray noch gespeichert ist, falls ja löse ich das bestehende auf und speicher die werte daraus in die andere cloud. danach beende ich die schleifen und lasse den code erneut durchlaufen, solange bis kein Wert mehr in einer anderen Cloud gefunden werden kann.
Was meint ihr? Schöne Lösung oder habe ich ein Monster erschaffen?
Mir ist klar, das dieser Code schnell bei vielen Datenmengen in die Knie gehen kann, gibt es schönere Lösungen?