问题描述
|
我在PHP中(从MysqL调用)有一个数组,其中包含一个ORDER(整数),一个UUID和一个MODIFIED(时间戳)。该数组按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,然后循环遍历数组中剩余的记录,直到不再有重复项为止。
这比我以前习惯的编程更高级,确实需要一些帮助。任何人任何时候都可以给予的感谢。
解决方法
要执行您想要的操作,最简单的方法是将数组的所有元素放入另一个数组中。第二个数组将按顺序键入。否则,它将包含id(修改顺序和计数)(如果要轻松重用子数组,请排序)。
遍历原始数组时,请使用
isset()
检查第二个数组中是否有该顺序的条目。如果已设置,则比较日期,如果当前日期较新,则更新并增加计数。如果不存在,则将其设置为1。
例:
$new_array (
400 => (
id => \'blah\',order => 400,modified => \'new date\',count => 2,),401 => (
id => \'blah2\',order => 401,modified => \'date\',count => 1,)
, 这仅需要一个循环。因此这将是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
?>