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

Php 使用空数据自动填充数组以匹配其他数组大小,php,arrays,Php,Arrays,我有两套阵列: $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'); 正如您所看到的,第二个数据集的日期较少,因此我需要“自动填充”数组的重

我有两套阵列:

$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个以上的数据集,因此我必须找到最大的数据集,并为每个较小的数据集运行一个函数以正确格式化它


我要创建的函数是我的问题。甚至不知道从哪里开始。此外,如果出于某种原因,我可以对日期和数据数组进行不同的格式化(多维数组?),这样会更好。

您应该使用哈希映射而不是数组来将每个日期与数据关联起来

然后,找到最大的一个,用foreach循环遍历其密钥,并测试小密钥中是否存在相同的密钥

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


用代码编辑(为了完整起见,其他答案似乎更好):


您可以使用一些数组函数以非常简单的方式完成这项工作。试着这样做:

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

如果数据是相关的,那么将它们分散在多个数组中会很痛苦。 最好的解决方案是使用明显的属性名对对象进行建模 并与相关访问器一起使用

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

我假装你需要每天登录一个有下载的网站。我不使用dates/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
类建模,所有方法都返回一个day实例(是的,也删除)并根据签名。day类的每个属性都有标准的getter/setter(您可以解析为magic方法)

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

很难向您展示一些代码,因为问题是缺少有关数据模型的详细信息

如果仍要填充阵列,则此代码将是一个良好的开端:

$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(....

我想要一些代码。对于哈希映射的最佳格式也有点困惑。最好采用zombat answer,数组*函数是本机的,速度更快。@另一个开发人员使用代码进行了完整性编辑。上述评论仍然适用。
list($dates, $data1, $data2) = array_map(....