PHP根据时间戳和顺序重新排序数组

时间:2011-06-21 22:23:12

标签: php arrays

我有一个PHP(来自MYSQL调用)的数组,其中包含一个UDER和一个MODIFIED(时间戳)的ORDER(整数)。数组按ORDER升序排序,然后按MODIFIED排序。

例如:

$resource['Resource']['id'];
$resource['Resource']['order'];
$resource['Resource']['modified'];

要测试这些,我正在使用以下循环:

foreach ($resources as $resource):
   echo '<tr><td>' . $resource['Resource']['id'] . '</td>';
   echo '<td>' . $resource['Resource']['order'] . '</td>';
   echo '<td>' . $resource['Resource']['modified'] . '</td></tr>';
endforeach;

有时,当执行某项操作时,ORDER可能会重复。例如:

4dff97be-b0c4-45ac-a568-12f2cdbabb55,400,2011-06-21 15:10:35

4e01006a-d46c-4f83-8c78-0eb1cdbabb55,400,2011-06-21 15:15:42

当发生这种情况时,我需要一个函数来循环数据,直到它找到两个重复项(当然它们将彼此相邻(因为数组按ORDER / MODIFIED排序,见上文)。当它找到两个时我需要它来查看哪个是最新的,将其递增1,然后循环遍历数组中的其余记录,直到不再有重复项。

这是比我以前更高级的编程,真的,真的需要一些帮助。任何时候任何人都可以给予它将被感激地接受。

2 个答案:

答案 0 :(得分:0)

这只需要一个循环。所以这将是O(n)操作。

这个问题很简单。所以不要流汗吧。这将适用于您可能拥有的许多重复项。

<?
    $my_data = array();        
    $temp = reset($resource)
    $my_data[0] = $temp;

    $c = 0;
    next(resource);
    foreach ($resource as $one_resource)
    {
        $c++;

        if ($one_resource['order'] == $temp['order'])
        {
                $my_data[($c-1)] = $one_resource;
                $c--;
        }
        else
        {
                $my_data[$c] = $one_resource;
        }

        $temp = $one_resource;
    }

    // When the loop finishes, you'll have the data you want in the array $my_data
?>

答案 1 :(得分:0)

要做你想做的事,最简单的方法是将数组的所有元素放到不同的数组中。第二个数组将由订单键入。否则,它将包含id,(如果您想轻松重用子数组,则为order),修改日期和计数。

在浏览原始数组时,使用isset()检查该订单的第二个数组中是否有条目。如果已设置,则比较日期并更新当前日期是否更新并增加计数。如果它不存在,只需设置它并使count = 1。

示例:

$new_array (
   400 => (
      id => 'blah',
      order => 400,
      modified => 'new date',
      count => 2,
   ),
   401 => (
      id => 'blah2',
      order => 401,
      modified => 'date',
      count => 1,
   ),
)