Hi Forum,
ich bin relativ neu in PHP und es mag sein dass ich meine Frage nun wirklich dumm stelle, ich hoffe ihr habt Nachsicht. Ich gehöre zur Kategorie "Learning by Doing", dh. ich probier gerne aus biswas funktioniert und verstehe den Ablauf dann meistens erst danach
Ich werd mein problem gleich ausführlich erklären, mit Code, ich hoffe es ist nicht zuviel... Ich habe folgendes Anliegen:
Ich habe hier eine mySQL Datenbank mit rund 15.000 sauberen Kontakten. Die Kontakte werden auch in dieser Datenbank gepflegt und sollen nun zusätzlich in ein Office 365 Grad Konto überführt werden. Sodass sich bestimmte Mitarbeiter die Kontakte auch ganz einfach als ExchangeKonto auf dem handy einrichten können. Es soll KEIN Sync stattfinden sondern immer nur von einer in die andere Richtung übertragen werden.
Ich hab mir die Office Schnittstelle mal angesehen und komme auch ganz gut damit klar. Ich mache mal ein Beispiel zu meinem Problem: Nehmen wir an im OfficeKonto in der Cloud sind grade keine Kontakte gespeichert, in der mySQL sind es 15.000. Nun gehe ich hin und mache folgendes:
1. Ich hole mir erstmal alle Office Kontakte in ein Array, und zwar nur bestimmte Felder, das geschieht mittels CURL:
// DIE OFFICE KONTAKTE
in dem array sind nun aktuell keine Kontakte. Nun bau ich mir ein Array aus meinen mySQL Kontakten:
// DIE mySQL KONTAKTE
Nun hab ich ein zweites Array mit 15.000 Kontakten. Es geht mir nun darum die Arrays, die nur die nötigsten Felder haben, miteinander zu vergleichen. Wenn im Office ein Kontakt NICHT vorhanden ist dann muss ich den mit einem CURL anlegen. Wenn er vorhanden ist muss ich ihn ignorieren. So einfach eigentlich. Ich habe folgende Funktion:
mit dieser Funktion gehe ich nun jeden mySQL Kontakt durch und prüfe ob's den im anderen Office-Array schon gibt:
Ich bau mir daraus also einzelne Aufgaben die ich abarbeite. Die Aufgaben lauten dann eben zB "Anlegen von Kontakt mit ID XY da nicht vorhanden". Die Aufgaben speichere ich auch wieder in ein Array. Das lass ich dann abarbeiten. Wenn eine Aufgabe erledigt wurde wird per Metarefresh die Seite neu geladen und der nächste Kontakt kommt dran. Im Office ist dann einer mehr und der wird dann übersprungen. Usw.
Das Problem ist, je mehr Kontakte im Office (also im ersten Array sind) desto länger dauert der Vergleich zwischen den beiden Arrays. Ich merke jetzt nämlich dass ich mit dieser Vorgehensweise auf dem Holzweg bin weil ich eben viele Kontakte habe. Hat jemand für mich einen Denkansatz wie ich das ganze wesentlich schneller umsetzen kann? Habe mir überlegt zuerst alle Office Kontakte in eine temporäre mySQL zu speichern. Ich bekomme ALLE Kontakte in Arrayform mit einem einzigen CURL Aufruf.
Dann würde ich den Vergleich in der mySQL direkt machen, diese liefert mir dann die Aufgaben die zu tun sind...
Ich hoffe ich konnte das alles einigermaßen erklären... Hoffe auf eure Hilfe. Vielen Dank. Auch wenn ich das jetzt wohl alles viel zu umständlich erklärt habe. Hätte vllt auch direkt fragen können wie man 2 Arrays blitzschnell miteinander vergleicht....!
lG Mirko
ich bin relativ neu in PHP und es mag sein dass ich meine Frage nun wirklich dumm stelle, ich hoffe ihr habt Nachsicht. Ich gehöre zur Kategorie "Learning by Doing", dh. ich probier gerne aus biswas funktioniert und verstehe den Ablauf dann meistens erst danach
Ich habe hier eine mySQL Datenbank mit rund 15.000 sauberen Kontakten. Die Kontakte werden auch in dieser Datenbank gepflegt und sollen nun zusätzlich in ein Office 365 Grad Konto überführt werden. Sodass sich bestimmte Mitarbeiter die Kontakte auch ganz einfach als ExchangeKonto auf dem handy einrichten können. Es soll KEIN Sync stattfinden sondern immer nur von einer in die andere Richtung übertragen werden.
Ich hab mir die Office Schnittstelle mal angesehen und komme auch ganz gut damit klar. Ich mache mal ein Beispiel zu meinem Problem: Nehmen wir an im OfficeKonto in der Cloud sind grade keine Kontakte gespeichert, in der mySQL sind es 15.000. Nun gehe ich hin und mache folgendes:
1. Ich hole mir erstmal alle Office Kontakte in ein Array, und zwar nur bestimmte Felder, das geschieht mittels CURL:
// DIE OFFICE KONTAKTE
PHP-Code:
$url_get_extension = array (
"\$select" => "Id,NickName,DateTimeCreated,DateTimeLastModif ied, DisplayName",
"\$orderby" => "NickName ASC",
"\$top" => "100000",
);
$url = "https://outlook.office.com/api/beta/me/contacts/?" . http_build_query($url_get_extension);
$headers = array(
"Authorization: Bearer " . $access_token,
"Accept: application/json",
"X-AnchorMailbox: XXX@XXX.de"
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($curl, CURLOPT_POSTFIELDS, "");
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$curl_response = curl_exec($curl);
curl_close($curl);
$office365_kontakte = json_decode($curl_response, true);
if($debugging == "on")
{
echo "<h4>DIE AKTUELLEN OFFICE365 KONTAKTE ALS ARRAY:</h4>";
echo "<pre>";
print_r($office365_kontakte);
echo "</pre>";
echo "<hr>";
}
// DIE mySQL KONTAKTE
PHP-Code:
mysqli_query($verbindung,"SET NAMES 'utf8'");
$ergebnis = mysqli_query($verbindung,"SELECT * FROM BLA_BLA");
while($row = mysqli_fetch_array($ergebnis))
{
$datenbankergebnis = array(
'@odata.id' => "",
'@odata.etag' => "",
'Id' => $row['Id'],
'NickName' => $row['NickName'],
'DateTimeLastModified' => $row['Manager'],
'DisplayName' => $row['DisplayName']
);
$mysql_kontakte['value'][] = $datenbankergebnis;
}
if($debugging == "on")
{
echo "<h3>DIE AKTUELLEN MYSQLKONTAKTE ALS ARRAY:</h3>";
echo "<pre>";
print_r($mysql_kontakte);
echo "</pre>";
echo "<hr>";
}
PHP-Code:
// ARRAY VERGLEICHEN UND SYNC AUFGABEN ERSTELLEN
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Funktion für das durchsuchen von multidimensionalen Arrays
function arraysuche($needle, $haystack)
{
if(in_array($needle, $haystack))
{
return true;
}
foreach($haystack as $element)
{
if(is_array($element) && arraysuche($needle, $element))
return true;
}
return false;
}
PHP-Code:
// Erstellen eines neuen Arrays mit allen Aufgaben die sich aus den Prüfungen ergeben
$aufgaben = array();
// Arrayvergleich: Prüfung anhand der ID's ob die ID online vorhanden ist, wenn nicht, neu anlegen
foreach($mysql_kontakte['value'] as $wert)
{
if(arraysuche($wert['Id'],$office365_kontakte))
{
//echo "ARRAYCHECK 1-1: Die VisionARCH ID <b>" . $wert['Id'] . "</b> (" . $wert['DisplayName'] . ") ist im Office365 vorhanden. Es muss nichts getan werden.<br>";
}
else
{
if($aufgaben_anzeigen == "on")
{
echo "ARRAYCHECK 1-2: Die VisionARCH ID <b>" . $wert['Id'] . "</b> (" . $wert['DisplayName'] . ") ist im Office365 <u>NICHT</u> vorhanden. Der VisionARCH-Kontakt wird online erstmalig hinzugefuegt.<br>";
}
$aufgaben[] = "CREATE " . $wert['Id'];
}
}
// Arrayvergleich: Prüfung anhand der Office365 ID's ob die ID online vorhanden ist, jedoch NICHT mehr im mysql
foreach($office365_kontakte['value'] as $wert)
{
if(empty($wert['NickName']))
{
$NickName = "-1"; // Setzen eines neuen NickNames für Kontakte die direkt ONLINE angelegt wurden und somit noch nie eine VisionARCH ID hatten
}
else
{
$NickName = $wert['NickName'];
}
if(arraysuche($NickName,$visionarch_kontakte))
{
//echo "ARRAYCHECK 2-1: Die Office365 ID (NickName) <b>" . $NickName . "</b> (" . $wert['DisplayName'] . ") ist im VisionACH vorhanden. Es muss nichts getan werden.<br>";
}
else
{
if($aufgaben_anzeigen == "on")
{
echo "ARRAYCHECK 2-2: Die Office365 ID (NickName) <b>" . $NickName . "</b> (" . $wert['DisplayName'] . ") ist <u>NICHT (MEHR)</u> im VisionARCH vorhanden. Der Office365-Kontakt wird geloescht.<br>";
}
$aufgaben[] = "DELETE " . $wert['Id'];
}
}
Das Problem ist, je mehr Kontakte im Office (also im ersten Array sind) desto länger dauert der Vergleich zwischen den beiden Arrays. Ich merke jetzt nämlich dass ich mit dieser Vorgehensweise auf dem Holzweg bin weil ich eben viele Kontakte habe. Hat jemand für mich einen Denkansatz wie ich das ganze wesentlich schneller umsetzen kann? Habe mir überlegt zuerst alle Office Kontakte in eine temporäre mySQL zu speichern. Ich bekomme ALLE Kontakte in Arrayform mit einem einzigen CURL Aufruf.
Dann würde ich den Vergleich in der mySQL direkt machen, diese liefert mir dann die Aufgaben die zu tun sind...
Ich hoffe ich konnte das alles einigermaßen erklären... Hoffe auf eure Hilfe. Vielen Dank. Auch wenn ich das jetzt wohl alles viel zu umständlich erklärt habe. Hätte vllt auch direkt fragen können wie man 2 Arrays blitzschnell miteinander vergleicht....!
lG Mirko

Kommentar