至于你有没有怀疑发现,array_merge_recursive()
固执地捣毁所有合并的阵列一起数字或“数字字符串”键转换为一维数组。为了避免这种行为,您需要将每个数组的初始键作为字符串转换,而不会被假定为array_merge_recursive()
的数字。
此外,你想筛选出所有具有空值的元素。
我最初编写了一个单线程,执行关键重新铸造然后过滤值,但效率不那么高。对于您的情况,您应该只在可能有包含空值的阵列上使用array_filter()
。
输入数组:
$a=[1=>"[email protected]",2=>"[email protected]",3=>"[email protected]"];
$b=[1=>"",2=>"4234235",3=>""];
$c=[2=>1];
代码:
// remove empty values from all arrays that may have them
$b=array_filter($b,'strlen');
// for all arrays, cast numeric keys to string by prepending with a space
function addK($v){return " $v";}
$a=array_combine(array_map('addK',array_keys($a)),$a);
$b=array_combine(array_map('addK',array_keys($b)),$b);
$c=array_combine(array_map('addK',array_keys($c)),$c);
// merge arrays recursively
$merged=array_merge_recursive($a,$b,$c);
// cast keys back to numeric
$merged=array_combine(array_map('trim',array_keys($merged)),$merged);
// force all top-level elements to be arrays
foreach($merged as $k=>$v){
if(is_string($merged[$k])){$merged[$k]=[$v];}
}
var_export($merged);
输出:
array (
1 => array (
0 => '[email protected]',
),
2 => array (
0 => '[email protected]',
1 => '4234235',
2 => 1,
),
3 => array (
0 => '[email protected]',
),
)
对于谁想要知道其中的差别读者当array_merge_recursive()
运行没有准备:
array (
0 => '[email protected]',
1 => '[email protected]',
2 => '[email protected]',
3 => '',
4 => '4234235',
5 => '',
6 => 1,
)
注意1d数组和重新索引的键?对OP来说完全没用。
最后,对于任何想要将所有数组的键重新投射并想让我的过程更加干燥的人,可能有机会设置可变参数函数或类似函数。我只是懒得去追求这个概念,因为我不想让自己的答案变得更复杂,也不是可怕的重复自己。
如果'$ b'或'$ c'数组的值比'$ a'数组多? – Bhaskar
编辑所以现在没关系 –