2015-08-28 58 views
1

我正在使用为雇员带回假期数据的API。数据包含已批准的假期请求以及已取消的假期请求。我现在面临的问题是,取消了假期的请求显示在下面的格式重复的条目:忽略来自多维数组的重复条目

stdClass Object 
    (
    [leave_requests] => Array 
    (
     [0] => stdClass Object 
      (
       [employee] => stdClass Object 
        (
         [id] => 30771 
        ) 

       [reviewed_by] => stdClass Object 
        (
         [id] => 22734 
        ) 

       [reason] => 
       [type] => Holiday 
       [deducted] => 1.0 
       [cancelled] => 
       [id] => 626214 
       [start_date] => 2015-08-20 
       [half_start] => 
       [half_start_am_pm] => 
       [end_date] => 2015-08-20 
       [half_end] => 
       [half_end_am_pm] => 
       [action] => request 
       [status] => approved 
       [notes] => 
       [created_at] => 2015-08-06T21:55:12+01:00 
       [updated_at] => 2015-08-07T08:26:07+01:00 
      ) 

     [1] => stdClass Object 
      (
       [employee] => stdClass Object 
        (
         [id] => 30771 
        ) 

       [reviewed_by] => stdClass Object 
        (
         [id] => 22734 
        ) 

       [reason] => 
       [type] => Holiday 
       [deducted] => 1.0 
       [cancelled] => 
       [id] => 632745 
       [start_date] => 2015-08-20 
       [half_start] => 
       [half_start_am_pm] => 
       [end_date] => 2015-08-20 
       [half_end] => 
       [half_end_am_pm] => 
       [action] => cancel 
       [status] => approved 
       [notes] => 
       [created_at] => 2015-08-12T17:50:32+01:00 
       [updated_at] => 2015-08-12T17:53:46+01:00 
      ) 

    ) 
) 

理想情况下,数据将被格式化,因此,在取消财产被利用,我可以过滤掉的是(这有被开发商要求)。我想要做的是删除具有相同的start_date和end_date的条目。

目前我能够删除重复的,通过使用该功能

function super_unique($array) 
    { 
     $newArr = array(); 
     foreach ($array as $val) { 
      $newArr[$val['startDate']] = $val; 
     } 
     $array = array_values($newArr); 

     return $array; 
    } 

夫妇的这个问题,在我仍然留下了其中一个条目,作为假日请求已取消我不希望他们中的任何一位在数据中。过滤数据以排除具有“取消”动作属性的所有元素仍然会让我保留原始请求。

另一个问题是,上述函数仅基于关闭start_date而不是start_date和end_date。

看过关于this SO question的评论,以及关于array_values和array_unique的PHP文档页面的评论。

回答

1

我已经取得了一些细微的修改,以你目前的代码,请参见注释代码:

function super_unique($array) 
{ 
    $newArr = array(); 

    foreach ($array as $val) { 
     // Create a key by combining start/end dates 
     $key = $val['startDate'].$val['endDate']; 

     // Have we already seen this start/end date combination? 
     if (array_key_exists($key, $newArr)) { 
      $val = null; // Clear element value, like "remove this later on" 
     } 
     $newArr[$key] = $val; // Add to/update key index (actual value or null) 
    } 

    // Remove all elements with unset (null) values 
    $array = array_filter(array_values($newArr)); 

    return $array; 
} 

$a = [['startDate' => '2015-08-20', // Exists twice - should be removed 
     'endDate' => '2015-08-22'], 
     ['startDate' => '2015-08-20', // Unique start/end combination 
     'endDate' => '2015-08-20'], 
     ['startDate' => '2015-08-21', // Unique start/end combination 
     'endDate' => '2015-08-21'], 
     ['startDate' => '2015-08-20', // Exists twice - should be removed 
     'endDate' => '2015-08-22'], 
     ['startDate' => '2015-08-22', // Unique start/end combination 
     'endDate' => '2015-08-20'], 
]; 

print_r(super_unique($a)); 

输出:

Array 
(
    [1] => Array 
     (
      [startDate] => 2015-08-20 
      [endDate] => 2015-08-20 
     ) 

    [2] => Array 
     (
      [startDate] => 2015-08-21 
      [endDate] => 2015-08-21 
     ) 

    [3] => Array 
     (
      [startDate] => 2015-08-22 
      [endDate] => 2015-08-20 
     ) 
) 
+0

绝对完美的,谢谢 – terrorfall

+0

不客气:) – mhall