至於你有沒有懷疑發現,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
編輯所以現在沒關係 –