首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用空数据自动填充数组以匹配其他数组大小

使用空数据自动填充数组以匹配其他数组大小
EN

Stack Overflow用户
提问于 2011-10-05 13:13:59
回答 3查看 385关注 0票数 2

我有两组数组:

代码语言:javascript
复制
$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');

如您所见,第二个数据集的日期较少,因此我需要“自动填充”数组的重置,以匹配最大的数据集。

代码语言:javascript
复制
$dates2 = array('9/12','9/13','9/14','9/15','9/16','9/17');
$data2 = array('','','12','1','','');

将有超过2个数据集,所以我必须找到最大的数据集,并为每个较小的数据集运行一个函数来正确地格式化它。

我创建的函数对我来说是个问题。在这一点上,甚至不确定从哪里开始。另外,我可以对日期和数据数组进行不同的格式化(多维数组?)如果出于某种原因,这样做更好。

EN

回答 3

Stack Overflow用户

发布于 2011-10-05 14:07:23

您可以使用一些数组函数以一种非常简单的方式完成此操作。尝试如下所示:

代码语言:javascript
复制
//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循环以对数组集进行操作将非常容易。我认为将它们转换为键/值对的关联数组也会使它们更容易使用。

票数 1
EN

Stack Overflow用户

发布于 2011-10-05 14:33:05

如果数据是相关,将它们分散在几个数组上将是痛苦的。最好的解决方案是使用明显的属性名称为对象建模,并将其与相关的访问器一起使用。

从你的问题中,我没有太多关于数据是什么的线索,然后我不得不猜测一下:

我假装你需要在一个有下载的网站上保持每天的登录访问。我不使用date/data1/data2数组,而是使用类似如下的数据结构建模:

代码语言:javascript
复制
$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)
    ...
)

使用这个数据结构,我将建模一个带有addremovegetsetsearch方法的dayCollection类,所有方法都返回一个day实例(是的,也是remove too)和相应的签名。day Class将为每个属性提供标准的getter/setter (您可以解析为魔术方法)。

根据您必须操作的数据量,您可以选择只在集合中维护对象数据(存储时序列化/检索时反序列化)或整个对象。

很难向你展示一些代码,因为这个问题缺乏关于你的数据模型的细节。

如果你仍然想填充你的数组,那么这段代码将是一个很好的开始:

代码语言:javascript
复制
$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中,您有自己的填充数组。如果您想替换您的数组,只需执行简单的

代码语言:javascript
复制
list($dates, $data1, $data2) = array_map(....
票数 1
EN

Stack Overflow用户

发布于 2011-10-05 13:24:46

您应该使用hashmap而不是数组来将每个日期与数据相关联。

然后,找到最大的一个,使用foreach循环它的键,并测试小的键中是否存在相同的键。

如果它不存在,则使用空值创建它。

用代码编辑(为了完整,其他答案看起来肯定更好):

代码语言:javascript
复制
$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]=''; }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7656963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档