2016-06-30 2 views
2

Я работаю с API Mailchimp на данный момент, у меня есть список кампаний, которые были запущены или должны быть запущены, и я хочу получить ссылку на недавно проведенной кампании. Как я могу сравнить атрибут «send_time», чтобы найти самый последний и связанный с ним родительский объект?массив объектов, выбирающих объект на основе значения атрибута

Массив кампании выглядит так,

{ 
    "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" 
     } 
    ] 
} 

Так что в этом массиве выше, конечный объект имеет самый последний send_time, как бы я оцениваю это, а затем захватить этот объект? У меня полу-решение, но оно кажется длинным.

<?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

Хотя то, что у вас есть это достаточно четкое решение, вы можете попробовать отсортировать свой объект с помощью 'usort' на' date_send', а затем получить отсортированный результат первой формы. –

+2

@Anant * «пожалуйста, проголосуйте за ответ тоже.». * Если человек (или кто-то еще в этом отношении) чувствует, что ваш ответ заслуживает дополнительного вознаграждения поверх того, что было принято, то это их решение. Это «ногами за очки». Вы «что» голодны для + репутации? –

+0

@ Fred-ii-, так как он отметил мой ответ, поэтому я просто указываю, что он тоже может голосовать. Я думаю, что мне нужно улучшить свой английский. Sorry –

ответ

2

array_multisort() Использование, как показано ниже (код одной строки): -

<?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; 
?> 

Выход: - https://eval.in/598349

Примечание: -

1.Если данные данные в массиве уже тогда нет необходимости использовать json_decode(), непосредственно использовать array_multisort() на нем

https://eval.in/598355

Для получения дополнительной справки: -

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

0

Вы можете сортировать объекты по этому свойству (я предлагаю usort, так что вы можете определить свою собственную сортировку), а затем получить первый элемент в этом массиве.

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]; 

Примечание: Я не запускать это, так что вы, возможно, придется настроить return на функцию сравнения, если это сортировка в неправильном порядке.

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 
?> 

Вы можете попробовать этот подход. Кроме того, вы можете использовать usort по send_time (прямое решение).

Я еще не выполнил этот код!

0

Если вы просто хотите, чтобы захватить максимальный элемент и хотите использовать меньше строк кода, попробуйте следующее:

  1. захватить максимальное время, отображая колонку «Время отправки» на время эпохи и получение максимальное значение
  2. Фильтр массива по записям, которые соответствуют этому максимальное время
  3. Profit

Пример:

$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); 

печати Будет:

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

) 

Примечание Преимущество этого в том, что она не нуждается в сортировке. Недостатком является то, что сортировка, а затем получение последнего элемента будет быстрее. Однако при сортировке вы теряете первоначальный порядок массивов, который иногда необходим.