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