Аб'яднаць 2 масіва і аб'яднаць вынікі лікавых ключоў

У мяне ёсць 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, але я страціў свае ключы, і яны не атрымліваюць групавацца.

2
Вы, верагодна, прыйдзецца напісаць сваю ўласную функцыю для гэтага паводзін
дададзена аўтар Petros Mastrantonas, крыніца

9 адказы

Калі я бачу, што права вы хочаце толькі той ключ для захоўвання масіва, што спасылка больш , чым адно значэнне. Астатнія ключы павінны па-ранейшаму ставяцца да скалярных значэнняў ...

Так што вам патрэбна стратэгія два кроку:

// 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
дададзена

Чаму б вам проста не напісаць метад, каб аб'яднаць іх?

/**
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;
}
1
дададзена
аб крута дзякуй :-)
дададзена аўтар Killrawr, крыніца
Вы можаце прапусціць першы Умоўны аператар, змяніўшы загаловак функцыі для: функцыі merge_array (масіў $ original_array, масіў $ new_array)
дададзена аўтар Marijke Luttekes, крыніца
Калі ласка. Гэта працуе толькі з масівамі і імёнаў аб'ектаў, каб прымусіць параметр быць такога тыпу. Гэта не пойдзе на Інтс, радкі і г.д.
дададзена аўтар Marijke Luttekes, крыніца

Толькі блок адчуў гэта. Ён павінен аб'яднанне масівы. Майце на ўвазе, што можна было б палепшыць з пункту гледжання прадукцыйнасці. Элементы без асацыятыўны ключ будзе групавацца ў ключ "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
)
1
дададзена
Ідэальным рашэннем было б выкарыстоўваць func_get_args (), так што метад можа прыняць шэраг масіваў.
дададзена аўтар lb., крыніца
<?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);

?>

Check the output in http://codepad.org/FrIlKRqk

І вынік

Array
(
[2009] => 131
[2008] => Array
    (
        [0] => 940
        [1] => 9
    )

[2007] => Array
    (
        [0] => 176
        [1] => 3
    )

[2006] => 1
[2011] => 67
)
1
дададзена

У рэшце рэшт я знайшоў гэтую функцыю, якая дапамагла мне. Дзякуй усім за ваш уклад.

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;
}
0
дададзена

спроба:

foreach ($your_array as $key => $value)
    $array_new[$key][] = $value;
print_r($array_new);
0
дададзена

probaly нешта падобнае? Калі запусціць такі цыкл для кожнага масіва (array1, array2, ...)

$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 );
    }
}

нб.: код не правяраў ...

0
дададзена

Я бачу шмат адказаў, але я не знайшоў іх выкарыстоўваць так Im дадаючы мой уласны

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;
}

Вы можаце змясціць у неабмежаваных аргументах :)

0
дададзена

Абодва масіва выкарыстоўваюць адны і тыя ж ключы, каб вы маглі зрабіць нешта простае, як гэта (працуе толькі на адным узроўні, хоць):

foreach ($array2 as $key => $value)
{
    $array1[$key][] = $value
}

<�Моцны> Update:

$array3 = array()
foreach ($array1 as $key => $value)
{
    $array3[$key][] = $value
}
foreach ($array2 as $key => $value)
{
    $array3[$key][] = $value
}
0
дададзена
гэта працуе без ( і ) ?
дададзена аўтар EaterOfCode, крыніца
дададзена аўтар EaterOfCode, крыніца
Ха-ха, гэта добра;) таксама ваша ідэя не ўяўлялася магчымым, таму што вы не можаце мець адны і тыя ж ключы ў масіве.
дададзена аўтар EaterOfCode, крыніца
Я вінавачу ў другой палове дня ў пятніцу, а ў PHP няма такога паняцця, як ключы дублікатаў. калі ёсць, можна чакаць шмат жаху. таму што, як вы хочаце рэалізаваць гэта? <�Код> array_addkey ?
дададзена аўтар EaterOfCode, крыніца
Я бачу тут змена Possiblity $ array1 [$ ключ] [] = $ значэнне у $ array1 [$ ключ] = array_merge ($ значэнне (масіў) $ array1 [$ ключ]) :)
дададзена аўтар EaterOfCode, крыніца
О, толькі заўважыў, што я напісаў гэта заснавана на ідэі, што ваша першая пераменная ўжо выкарыстоўваецца масіў для кожнага года. Так што гэта не будзе працаваць з вашай бягучай сітуацыяй. Я буду трымаць адказ толькі для даведкі.
дададзена аўтар Marijke Luttekes, крыніца
Не, ён не працуе без дужкі. Я так затрымаўся ў Python ата Я забыў PHP іх патрэбы: р (адрэдагаваны код)
дададзена аўтар Marijke Luttekes, крыніца
Так што альбо пятніцу ў другой палове дня гуляць ўверх, ці я не выкарыстоўваю ключы дублюючых?
дададзена аўтар Marijke Luttekes, крыніца
Ну, натуральна, вы сутыкнецеся з праблемамі, калі вы выкарыстоўваеце адзін ключ два разы або больш ... Аднак, у маім кодзе я дадаваў значэнне ў масіў з дапамогай клавішы $ ключ , які не можа стварыць дубляваныя ключы.
дададзена аўтар Marijke Luttekes, крыніца