我有2个数组,我希望通过每个数字键合并/组合在一起。 例如
Array1
(
[2009] => 131
[2008] => 940
[2007] => 176
[2006] => 1
)
Array2
(
[2008] => 9
[2007] => 3
)
我希望输出为:
Array (
[2009] => 131
[2008] => Array (
[0]=>940
[1]=>9
)
[2007] => Array (
[0]=>176
[1]=>3
)
[2006] => 1
)
我到底如何实现这一目标?我已经尝试过array_merge,但是我丢失了我的密钥并且它们没有被分组。
答案 0 :(得分:1)
如果我看到了正确的你只想要那些键来保存数组,那么引用 more 而不是单个值。其他键仍应引用标量值......
所以你需要一个两步策略:
// 1.) turn _all keys into arrays
foreach (array($input1,$input2) as $array)
foreach ($array1 as $key=>$val)
$output[$key][]=$val;
// 2.) reconvert elements with single entry to a scalar value again
foreach ($output as $key=>$candidate)
if (1==count($candidate))
$output[$key]=$candidate[0];
// test output
print_r($output);
答案 1 :(得分:1)
你为什么不写一个合并它们的方法?
/**
Merge original_array with new_array
@param array original_array
@param array new_array
*/
function merge_array($original_array, $new_array)
{
$merged_array = array();
if(is_array($original_array) && is_array($new_array))
{
foreach($original_array as $key => $value)
{
$merged_row[] = $value;
if(isset($new_array[$key]))
{
$merged_row[] = $new_array[$key];
}
$merged_array[$key] = $merged_row;
}
} else $merged_array = $original_array;
return $merged_array;
}
答案 2 :(得分:1)
只是对此进行了单元测试。它应该联合数组。请注意,它可以在性能方面得到改善。没有关联键的项将被分组为键'0'。
public function merge(&$ar, $ar2) {
foreach ($ar as $k => $v) {
if (isset($ar2[$k])) {
$ar[$k] = array_merge(array($ar[$k]), array($ar2[$k]));
}
}
foreach ($ar2 as $k => $v) {
if (!isset($ar[$k])) {
$ar[$k] = $ar2[$k];
}
}
}
单元测试:
public static function test_merge() {
$ar1 = array(45, 'a' => 44, 'dog' => array(1), 'cat' => 3);
s($ar1, array(2, 'dog' => 2, 'cat' => 4, 'stuff' => 4.3));
print_r($ar1);
}
结果:
IArray
(
[0] => Array
(
[0] => 45
[1] => 2
)
[a] => 44
[dog] => Array
(
[0] => Array
(
[0] => 1
)
[1] => 2
)
[cat] => Array
(
[0] => 3
[1] => 4
)
[stuff] => 4.3
)
答案 3 :(得分:1)
<?php
$arrOne = array( 2009 => 131, 2008 => 940, 2007 => 176, 2006 => 1);
$arrTwo = array( 2008 => 9, 2007=> 3, 2011 => 67);
$output = array();
foreach($arrOne as $key=>$value){
if(isset($arrTwo[$key])){
$output[$key][] = $value;
$output[$key][] = $arrTwo[$key];
}
else{
$output[$key] = $value;
}
}
$output += $arrTwo; // To consider keys that were absent in $arrOne
print_r($output);
?>
中的输出
结果
Array
(
[2009] => 131
[2008] => Array
(
[0] => 940
[1] => 9
)
[2007] => Array
(
[0] => 176
[1] => 3
)
[2006] => 1
[2011] => 67
)
答案 4 :(得分:0)
两个数组都使用相同的键,所以你可以做这样简单的事情(虽然只适用于一个级别):
foreach ($array2 as $key => $value)
{
$array1[$key][] = $value
}
<强>更新强>
$array3 = array()
foreach ($array1 as $key => $value)
{
$array3[$key][] = $value
}
foreach ($array2 as $key => $value)
{
$array3[$key][] = $value
}
答案 5 :(得分:0)
$list = array()
foreach( $array1 as $key => $value ){
if( !array_key_exist( $key, $array) ){
$list[$key] = $value
} else if( !is_array( $list[$key] ) ) {
$list[$key] = array(list[$key])
} else {
array_push( $list[$key], $value );
}
}
nb。:代码未经过测试......
答案 6 :(得分:0)
尝试:
foreach ($your_array as $key => $value)
$array_new[$key][] = $value;
print_r($array_new);
答案 7 :(得分:0)
我看到很多答案,但我发现它们无法使用,所以我加入了自己的
function merge(){
$args = func_get_args();
$new = array();
foreach($args as $arg){
foreach($arg as $key => $item){
if(!isset($new[$key])){
$new[$key] = $item;
}else if (!is_array($new[$key)){
$new[$key] = array($new[$key],$item);
}else{
$new[$key][] = $item;
}
}
}
return $new;
}
你可以加入无限的论点:)
答案 8 :(得分:0)
我最终发现这个功能对我很有帮助。谢谢大家的意见。
function merge_common_keys()
{
$arr = func_get_args();
$num = func_num_args();
$keys = array();
$i = 0;
for ($i = 0; $i < $num; ++$i) {
$keys = array_merge($keys, array_keys($arr[$i]));
}
$keys = array_unique($keys);
$merged = array();
foreach ($keys as $key) {
$merged[$key] = array();
for ($i = 0; $i < $num; ++$i) {
$merged[$key][] = isset($arr[$i][$key]) ? $arr[$i][$key] : null;
}
}
return $merged;
}