我有一个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,然后循环遍历数组中的其余记录,直到不再有重复项。
这是比我以前更高级的编程,真的,真的需要一些帮助。任何时候任何人都可以给予它将被感激地接受。
答案 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,
),
)