我有两组数组:
$dates1 = array('9/12','9/13','9/14','9/15','9/16','9/17');
$data1 = array('5','3','7','7','22','18');
// for this dataset, the value on 9/12 is 5
$dates2 = array('9/14','9/15');
$data2 = array('12','1');如您所见,第二个数据集的日期较少,因此我需要“自动填充”数组的重置,以匹配最大的数据集。
$dates2 = array('9/12','9/13','9/14','9/15','9/16','9/17');
$data2 = array('','','12','1','','');将有超过2个数据集,所以我必须找到最大的数据集,并为每个较小的数据集运行一个函数来正确地格式化它。
我创建的函数对我来说是个问题。在这一点上,甚至不确定从哪里开始。另外,我可以对日期和数据数组进行不同的格式化(多维数组?)如果出于某种原因,这样做更好。
发布于 2011-10-05 14:07:23
您可以使用一些数组函数以一种非常简单的方式完成此操作。尝试如下所示:
//make an empty array matching your maximum-sized data set
$empty = array_fill_keys($dates1,'');
//for each array you wish to pad, do this:
//make key/value array
$new = array_combine($dates2,$data2);
//merge, overwriting empty keys with data values
$new = array_merge($empty,$new);
//if you want just the data values again
$data2 = array_values($new);
print_r($data2);将其转换为函数或将其放入for循环以对数组集进行操作将非常容易。我认为将它们转换为键/值对的关联数组也会使它们更容易使用。
发布于 2011-10-05 14:33:05
如果数据是相关,将它们分散在几个数组上将是痛苦的。最好的解决方案是使用明显的属性名称为对象建模,并将其与相关的访问器一起使用。
从你的问题中,我没有太多关于数据是什么的线索,然后我不得不猜测一下:
我假装你需要在一个有下载的网站上保持每天的登录访问。我不使用date/data1/data2数组,而是使用类似如下的数据结构建模:
$log = array(
array('date'=>'2011-09-12','accessCount'=>7,'downloadCount'=>3),
array('date'=>'2011-09-13','accessCount'=>9), /* better downloadsCount=>0 though */
array('date'=>'2011-09-15','accessCount'=>7,'downloadCount'=>3)
...
)使用这个数据结构,我将建模一个带有add、remove、get、set、search方法的dayCollection类,所有方法都返回一个day实例(是的,也是remove too)和相应的签名。day Class将为每个属性提供标准的getter/setter (您可以解析为魔术方法)。
根据您必须操作的数据量,您可以选择只在集合中维护对象数据(存储时序列化/检索时反序列化)或整个对象。
很难向你展示一些代码,因为这个问题缺乏关于你的数据模型的细节。
如果你仍然想填充你的数组,那么这段代码将是一个很好的开始:
$temp = array($dates, $data1, $data2);
$max = max(array_map('count',$temp));
$result = array_map( function($x) use($max) {
return array_pad($x,$max,0);
}, $temp);在$result中,您有自己的填充数组。如果您想替换您的数组,只需执行简单的
list($dates, $data1, $data2) = array_map(....发布于 2011-10-05 13:24:46
您应该使用hashmap而不是数组来将每个日期与数据相关联。
然后,找到最大的一个,使用foreach循环它的键,并测试小的键中是否存在相同的键。
如果它不存在,则使用空值创建它。
用代码编辑(为了完整,其他答案看起来肯定更好):
$dates_data1 = array('9/12'=>'5', '9/13'=>'3', '9/14'=>'7' /* continued */);
$dates_data2 = array('9/14'=>'12', '9/15'=>'1');
#cycle through each key (date) of the longest array
foreach($dates_data1 as $key => $value){
#check if the key exists in the smallest and add '' value if it does not
if(!isset( $date_data2[$key] )){ $date_data2[$key]=''; }
}https://stackoverflow.com/questions/7656963
复制相似问题