2016-07-23 14 views
2

Meine $addresses Array enthält mehrere Standorte für jede $client. Diese Adressen werden unter Verwendung elterlicher Beziehungen in Laravel abgerufen.Hinzufügen von Eigenschaften zu jedem Objekt in PHP-Array

Ich möchte jede Adresse abrufen, die Entfernung von einem Ursprung (mit Google Maps API) ermitteln und dann diese Entfernung zu jedem Objekt hinzufügen.

Ich kann durch jeden Schlüssel iterieren und ihn mit den neuen Daten neu hinzufügen, aber gibt es eine einfachere Methode, die Postleitzahl zu lesen, die Entfernung zu bekommen und diese zu jedem hinzuzufügen?

$client = client::find($id); 
$addresses = $client->address()->get(); 

langatmig Methode:

foreach ($addresses as $address) { 

      $newAddress= new \stdClass; 
      $newAddress->label = $address->label; //seems redundant 
      $newAddress->street= $address->street; //seems redundant 
      $newAddress->postcode = $address->postcode; //seems redundant 

      $newAddress->distance = (function to get distance) //this is the only new data 

      $newAddresses[] = $newAddress; 
} 

Antwort

3

Sie Vorteil der references nehmen können mit dem Zeichen & in Ihrer foreach-Schleife Erklärung.

foreach ($addresses as &$address) { 

     $address->distance = (function to get distance); //this is the only new data 
} 

Bitte beachten Sie, dass nach Referenzen in foreach-Schleifen verwenden, die Variable den Verweis enthält, die für den Rest des Umfangs wird baumeln.

Im obigen Beispiel verweist jede spätere Verwendung der Variablen $ adresse immer noch auf das letzte Element des Arrays $ addresses.

Sie können der Referenz loszuwerden

unset($address); 

nach der Schleife aufrufen.

Oder können Sie diese Alternative verwenden Sie stattdessen:

foreach($addresses as $key => $adress) { 

    $addresses[ $key]->distance = (function to get distance); 

} 
+0

Das ist perfekt, danke! –

+0

Das '&' ist in foreach nicht notwendig, es wird kein Argument an eine Funktion übergeben. d. h. es funktioniert ohne, also: 'foreach ($ Adressen als $ Adresse)' –

+0

Die & ist in der Tat notwendig, wenn Sie das Element ändern möchten. Ich habe eine Alternative hinzugefügt, wenn Sie keine Referenzen in einer foreach-Schleife verwenden möchten, sowie einige Warnungen bezüglich dangling Referenzen. –

-1

i was eine bessere Lösung für Ihre Arbeit besteht.

sollten Sie Ihrem Modell ein Feld hinzufügen, um die Entfernung zu sparen.

und Update-Event für Ihre Adresse hinzufügen Abstand zu erhalten, wenn Ihr Modell

auf diese Weise aktualisiert, ruft google map api abnehmen wird.