2016-06-30 12 views
2

Ich arbeite mit der Mailchimp API im Moment, ich habe eine Liste von Kampagnen, die ausgeführt wurden oder ausgeführt werden sollen, und ich möchte den Link für die zuletzt durchgeführte Kampagne. Wie würde ich das Attribut "send_time" vergleichen, um das aktuellste und das zugehörige übergeordnete Objekt zu finden?Array von Objekten Auswahl von Objekt basierend auf Attributwert

Die Kampagnen-Array wie folgt aussehen,

{ 
    "campaigns": [ 
     { 
      "id": 1, 
      "type": "regular", 
      "status": "save", 
      "send_time": "" 
     }, 
     { 
      "id": 2, 
      "type": "regular", 
      "status": "sent", 
      "send_time": "2015-11-11T14:42:58+00:00" 
     }, 
     { 
      "id": 3, 
      "type": "regular", 
      "status": "sent", 
      "send_time": "2016-01-01T14:42:58+00:00" 
     }, 
     { 
      "id": 4, 
      "type": "regular", 
      "status": "sent", 
      "send_time": "2016-06-12T14:42:58+00:00" 
     } 
    ] 
} 

Also in diesem oben Array, hat das letzte Objekt die neueste Sendezeit, wie würde ich dies beurteilen zu können, und dann das Objekt greifen? Ich habe eine halb Lösung, aber es scheint langatmig.

<?php 
    //Build an array of send_times 
    $dates = []; 
    foreach($result['campaigns'] as $campaign) { 
     $dates[$campaign['id']] = $campaign['send_time']; 
    } 

    //Get the most recent date 
    $mostRecent = 0; 
    foreach($dates as $k => $v) { 
     $curDate = strtotime($v); 
     if($curDate > $mostRecent) { 
      $mostRecent = $curDate 
      $currentId = $k; 
     } 
    } 

    //Get the object 
    foreach($results['campaigns'] as $campaign) { 
     if($campaign['id'] == $currentId) { 
      $c = $campaign; 
     } 
    } 
?> 
+0

Obwohl, was Sie haben eine ist Ganz klare Lösung, Sie können versuchen, Ihr Objekt mit 'usort' durch' date_send' zu sortieren und dann das erste Element Formular sortierte Ergebnis zu nehmen. –

+2

@Anant * "Bitte stimmen Sie die Antwort zu.Thanks" * - Wenn die Person (oder jemand anderes in der Angelegenheit) der Meinung ist, dass Ihre Antwort zusätzlich zu dem, was akzeptiert wurde, eine zusätzliche Verbesserung verdient, dann ist dies ihre Entscheidung. Das ist "kicking for points". Bist du "das" hungrig auf + rep? –

+0

@ Fred-ii- da er meine Antwort markiert hat, zeige ich nur, dass er auch abstimmen kann. Ich denke, dass ich mein Englisch verbessern muss. Sorry –

Antwort

2

Verwenden array_multisort() wie unten (Einzelleitungscode): -

<?php  
$data = '{ 
    "campaigns": [ 
     { 
      "id": 1, 
      "type": "regular", 
      "status": "save", 
      "send_time": "" 
     }, 
     { 
      "id": 2, 
      "type": "regular", 
      "status": "sent", 
      "send_time": "2015-11-11T14:42:58+00:00" 
     }, 
     { 
      "id": 3, 
      "type": "regular", 
      "status": "sent", 
      "send_time": "2016-01-01T14:42:58+00:00" 
     }, 
     { 
      "id": 4, 
      "type": "regular", 
      "status": "sent", 
      "send_time": "2016-06-12T14:42:58+00:00" 
     } 
    ] 
}'; 
$array = json_decode($data,true)['campaigns']; // decode json string to array 
array_multisort($array,SORT_DESC, SORT_STRING); // use of array_multisort 
echo "<pre/>";print_r($array); // this will returns you indexed array like 0,1,2... you can again convert it to campaigns array like $final_array['campaigns'] = $array; 
?> 

Output: - https://eval.in/598349

Hinweis: -

1.Wenn Ihre angegebenen Daten in Array ist bereits dann keine Notwendigkeit json_decode() zu verwenden, verwenden Sie direkt array_multisort() auf sie

https://eval.in/598355

Weitere Referenz: -

http://sg2.php.net/manual/en/function.array-multisort.php

0

Sie können Ihre Objekte von dieser Eigenschaft sortieren (I usort würde vorschlagen, so dass Sie Ihre eigene Sortierung definieren können) und dann in diesem Array das erste Element erhalten.

usort($result, function ($campaign1, $campaign2) { 
    if ($campaign1['send_time'] == $campaign2['send_time']) { 
     return 0; 
    } 

    return (strtotime($campaign1['send_time']) > strtotime($campaign2['send_time'])) ? -1 : 1; 
}); 

$mostRecentCampaign = $campaign[0]; 

Hinweis: Ich habe dies nicht ausgeführt, so dass Sie die return auf der Vergleichsfunktion optimieren könnten, wenn es in der falschen Reihenfolge Sortierung ist.

2
<?php 
    $dates = []; 
    $recent_campaign = null; 
    $recent_time = 0; 
    foreach($result['campaigns'] as $campaign) { 
     $curDate = strtotime($campaign['send_time']); 
     if($curDate > $recent_time) { 
      $recent_time = $curDate 
      $recent_campaign = $campaign; 
     } 
    } 
    //$recent_campaign is the most recent campaign 
?> 

Sie können diesen Ansatz versuchen. Andernfalls können Sie usort von send_time (direkte Lösung) verwenden.

Ich habe diesen Code nicht ausgeführt!

0

Wenn Sie nur die max Element greifen wollen und weniger Codezeilen verwenden, versuchen Sie dies:

  1. Besorgen Sie sich die max Zeit durch die Abbildung der Spalte zu einer Zeit, Zeit „Zeit senden“ und die immer max Wert
  2. Filter Array durch die Einträge, die zu dieser Zeit entsprechen max
  3. Profit

Beispiel:

Würde
$dataArray = /* your array */ 
$maxTime = max(array_map('strtotime',array_column($dataArray["campaigns"], 'send_time'))); 
$maxEntry = array_filter($dataArray["campaigns"], function ($arr) use ($maxTime) { return strtotime($arr["send_time"])==$maxTime; }); 
print_r($maxEntry); 

drucken:

Array 
(
    [3] => Array 
     (
      [id] => 4 
      [type] => regular 
      [status] => sent 
      [send_time] => 2016-06-12T14:42:58+00:00 
     ) 

) 

Hinweis Der Vorteil davon ist, dass es nicht das Sortieren braucht. Der Nachteil ist, dass Sortieren und dann das letzte Element schneller erhalten würde. Bei der Sortierung verlieren Sie jedoch die ursprüngliche Array-Reihenfolge, die manchmal benötigt wird.

Verwandte Themen