Конвертировать многомерный массив в пользовательскую форму - PullRequest
0 голосов
/ 14 октября 2018

У меня есть массив

     $arr = array (
  0 => 
  array (
    'id' => '340',
    'days' => '1',
    'start_date' => '2018-10-12 00:00:00',
    'end_date' => '2018-10-13 00:00:00',
  ),
  1 => 
  array (
    'id' => '346',
    'days' => '2',
    'start_date' => '2018-10-12 00:00:00',
    'end_date' => '2018-10-14 00:00:00',
  ),
  2 => 
  array (
    'id' => '339',
    'days' => '3',
    'start_date' => '2018-10-12 00:00:00',
    'end_date' => '2018-10-15 00:00:00',
  ),
  3 => 
  array (
    'id' => '302',
    'days' => '4',
    'start_date' => '2018-10-12 00:00:00',
    'end_date' => '2018-10-16 00:00:00',
  ),
  4 => 
  array (
    'id' => '308',
    'days' => '5',
    'start_date' => '2018-10-12 00:00:00',
    'end_date' => '2018-10-17 00:00:00',
  ),
  5 => 
  array (
    'id' => '354',
    'days' => '1',
    'start_date' => '2018-10-13 00:00:00',
    'end_date' => '2018-10-14 00:00:00',
  ),
  6 => 
  array (
    'id' => '369',
    'days' => '1',
    'start_date' => '2018-10-14 00:00:00',
    'end_date' => '2018-10-15 00:00:00',
  )
);

Выходные данные:

$arr = array (

      0 => 
      array (
        'id' => '308',
        'days' => '5',
        'start_date' => '2018-10-12 00:00:00',
        'end_date' => '2018-10-17 00:00:00',
      ),
      1 => 
      array (
        'id' => '354',
        'days' => '1',
        'start_date' => '2018-10-13 00:00:00',
        'end_date' => '2018-10-14 00:00:00',
      ),
      2 => 
      array (
        'id' => '369',
        'days' => '1',
        'start_date' => '2018-10-14 00:00:00',
        'end_date' => '2018-10-15 00:00:00',
      )
    );

Условие:

Я хочу удалить дубликат 'start_date', т.е. start_date =2018-10-12 с наименьшим числом «дней» и сохранить только дату, которая состоит из большего количества дней.Я пытался использовать запрос MySQL, но я не получил желаемого результата, также я попытался array_unique () с параметром числового формата, но я пока не добился успеха.Помощь приветствуется.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 14 октября 2018

нет никакой функции по умолчанию для этого, поэтому используйте логику и другие доступные функции массива

`$result = array();

 $start_date=array();


foreach ($arr as $ele) {

  if(!in_array($ele['start_date'],$start_date)
  {
     $result[]=$ele;
  }    
 $start_date[]=$ele['start_date'];

 }
print_r($result); `

Может быть полезно для вас

0 голосов
/ 14 октября 2018

Шаг # 1: Сортируйте ваш массив массивов от минимального к максимальному, используя значения столбца days.

usort($arr, function($a, $b){ return $a['days'] <=> $b['days'];});

* по совпадению, этого шага можно избежать, поскольку ваши данные уже находятся в подходящем порядке.

Шаг № 2: Использовать столбец массива, чтобы назначить ассоциативные ключи для каждого подмассива.Как правило, массивы не могут содержать повторяющиеся ключи, поэтому более ранние строки перезаписываются (удаляются) более поздними строками - это дает желаемый результат.array_values() вызывается для удаления временных ключей.

var_export(array_values(array_column($arr, null, 'start_date')));

Код: ( Демо )

$arr = [
    ['id' => '340', 'days' => '1', 'start_date' => '2018-10-12 00:00:00', 'end_date' => '2018-10-13 00:00:00'],
    ['id' => '346', 'days' => '2', 'start_date' => '2018-10-12 00:00:00', 'end_date' => '2018-10-14 00:00:00'],
    ['id' => '339', 'days' => '3', 'start_date' => '2018-10-12 00:00:00', 'end_date' => '2018-10-15 00:00:00'],
    ['id' => '302', 'days' => '4', 'start_date' => '2018-10-12 00:00:00', 'end_date' => '2018-10-16 00:00:00'],
    ['id' => '308', 'days' => '5', 'start_date' => '2018-10-12 00:00:00', 'end_date' => '2018-10-17 00:00:00'],
    ['id' => '354', 'days' => '1', 'start_date' => '2018-10-13 00:00:00', 'end_date' => '2018-10-14 00:00:00'],
    ['id' => '369', 'days' => '1', 'start_date' => '2018-10-14 00:00:00', 'end_date' => '2018-10-15 00:00:00']
];

usort($arr, function($a, $b){ return $a['days'] <=> $b['days'];});
var_export(array_values(array_column($arr, null, 'start_date')));

Вывод:

array (
  0 => 
  array (
    'id' => '308',
    'days' => '5',
    'start_date' => '2018-10-12 00:00:00',
    'end_date' => '2018-10-17 00:00:00',
  ),
  1 => 
  array (
    'id' => '354',
    'days' => '1',
    'start_date' => '2018-10-13 00:00:00',
    'end_date' => '2018-10-14 00:00:00',
  ),
  2 => 
  array (
    'id' => '369',
    'days' => '1',
    'start_date' => '2018-10-14 00:00:00',
    'end_date' => '2018-10-15 00:00:00',
  ),
)
0 голосов
/ 14 октября 2018

Вот как вы можете сделать это в PHP:

foreach ($arr as $row) {
    $key = $row["start_date"];
    if (!isset($result[$key]) || $result[$key]["days"] < $row["days"]) {
        $result[$key] = $row;
    }
}

$result = array_values($result);

Обратите внимание на < в условии if: это гарантирует, что вы получите записи с наибольшим количеством дней.Переключитесь на >, чтобы получить наименьшее количество дней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...