2012-04-03 61 views
0

技术使用:PHP 5.3.10按时间排序合并不同PHP数组值到彼此和

嗨,我有一个阵列(下面的例子)我需要由相同的组合倍来操纵,CONCAT任何适用OFFERID的给一个逗号分隔的字符串,最后返回按时间排序的字符串!没有太多啦:)

我看着这个答案ID行:https://stackoverflow.com/a/1019534/260023但是我画了一个空白,一旦我已经确定的行如何modily在它的数据...

Array 
(
[0] => Array 
    (
     [dateTime] => 2012-04-03T18:00:00 
     [offerIDs] => 
    ) 

[1] => Array 
    (
     [dateTime] => 2012-04-03T18:30:00 
     [offerIDs] => 
    ) 

[2] => Array 
    (
     [dateTime] => 2012-04-03T19:00:00 
     [offerIDs] => 
    ) 

[3] => Array 
    (
     [dateTime] => 2012-04-03T21:00:00 
     [offerIDs] => 
    ) 


[4] => Array 
    (
     [dateTime] => 2012-04-03T18:00:00 
     [offerIDs] => 17302 
    ) 

[5] => Array 
    (
     [dateTime] => 2012-04-03T18:30:00 
     [offerIDs] => 17302 
    ) 

[6] => Array 
    (
     [dateTime] => 2012-04-03T19:00:00 
     [offerIDs] => 17302 
    ) 

[7] => Array 
    (
     [dateTime] => 2012-04-03T19:30:00 
     [offerIDs] => 17302 
    ) 

[8] => Array 
    (
     [dateTime] => 2012-04-03T20:00:00 
     [offerIDs] => 17302 
    ) 

[9] => Array 
    (
     [dateTime] => 2012-04-03T20:30:00 
     [offerIDs] => 17302 
    ) 

[10] => Array 
    (
     [dateTime] => 2012-04-03T19:00:00 
     [offerIDs] => 17298 
    ) 

) 

这应该导致:

Array 
(
[0] => Array 
    (
     [dateTime] => 2012-04-03T18:00:00 
     [offerIDs] => 17302 
    ) 

[1] => Array 
    (
     [dateTime] => 2012-04-03T18:30:00 
     [offerIDs] => 17302 
    ) 

[2] => Array 
    (
     [dateTime] => 2012-04-03T19:00:00 
     [offerIDs] => 17302,17298 
    ) 


[6] => Array 
    (
     [dateTime] => 2012-04-03T19:30:00 
     [offerIDs] => 17302 
    ) 

[7] => Array 
    (
     [dateTime] => 2012-04-03T20:00:00 
     [offerIDs] => 17302 


[8] => Array 
    (
     [dateTime] => 2012-04-03T20:30:00 
     [offerIDs] => 17302 
    ) 

[9] => Array 
    (
     [dateTime] => 2012-04-03T21:00:00 
     [offerIDs] => 
    ) 
) 
+0

感谢到目前为止所有的答案,看起来像标准的建议是密钥转换日期时间等会做并回报 – 2012-04-03 14:15:18

+0

非常感谢大家,我勾选了我最终使用的答案,但是当您将日期时间用作数组键时,您几乎都会破解它。再次感谢,这让我发疯了! – 2012-04-04 16:11:30

回答

1

像这样的东西应该工作:

$newarray = array(); 

foreach ($array as $elements) { 
    if (empty($newarray[$elements['dateTime'])) { 
    $newarray[$elements['dateTime']] = $elements['offerIDs']; 
    } else { 
    $newarray[$elements['dateTime']] .= $elements['offerIDs']; 
    } 
} 

现在,通过时间使用mingos提供的代码运行一个简单的排序。

重新排序的数组:

$finalarray = array(); 

foreach ($array as $d => $v) { 
    $finalarray[] = array('dateTime' = $d, 'offerIDs' => $v); 
} 
0

首先,滤出该阵列具有规则foreach然后使用usort()梳理出来。

usort函数使您能够决定如何完成排序(通过传递您自己的比较函数)。

+0

所以我可以用foreach循环访问数组,这很好。但是,一旦我找到匹配的dateTime,如何修改此匹配以将offerId添加到它? – 2012-04-03 14:03:50

+1

在重新阅读你的目标之后,我会说我会改变你的做法,让时间成为数组的索引。然后你只需检查索引是否已被使用。 – Christian 2012-04-03 14:06:08

1

看看usort()函数。它可以让你定义你需要的任何自定义排序。

排序日期最简单的方法可能是将它们转换为时间戳:

$date1 = new Date('2012-04-03T18:00:00'); 
$date2 = new Date('2012-04-03T20:00:00'); 
if ($date1->getTimestamp() > $date2->getTimestamp()) { 
    // do something 
} else { 
    // do something else 
} 

我觉得这两个部分信息应该让你写一个适当的排序功能)。

[编辑]

我只是想,经过重新阅读您的文章另一种可能性。

你可能的foreach对所有的结果和创建输出数组是这样的:

foreach ($input as $item) { 
    if (!array_key_exists($item['dateTime']),$output) { 
     $output[$item['dateTime']] = $item['offerIDs']; 
    } 
    if (empty($output[$item['dateTime']])) { 
     $output[$item['dateTime']] = $item['offerIDs']; 
    } 
} 

因此,输出数组将成为日期时间=> offerIDs对。您可以轻松地对其进行排序,然后重新转换为您的预期输出数组。

1

就是这样。将日期转换为UNIX(用于保险)。并创建一个新的数组与日期

foreach($out as $v){ 
    $new_out[strtotime($v['dateTime'])] = $v; 
} 

sort($new_out); 
1

假设$data的关键是你的阵列

# indexed result by time 
$tmp = array(); 
foreach($data as $d) { 
    $tmp[$d['dateTime']][] = $d['offerIDs']; 
} 

# sort keys 
ksort($tmp); 

# This will result in (then you might have to use implode(',', $offer_ids) 
# array(
# '2012-04-03T19:00:00' => array(1234, 45234), 
#), 

# this is what's you expected 
$finals = array(); 
foreach($tmp as $key => $vals) { 
    $finals[] = array(
     'dateTime' => $key, 
     'offerIDs' => implode(',', $vals), 
    ), 
}