【问题标题】:PHP join 2 arraysPHP加入2个数组
【发布时间】:2013-05-16 22:48:56
【问题描述】:

我有 2 个数组

$array1 = array(
    ['2013-05-01']=>'test',
    ['2013-05-02']=>'testing',
    ['2013-05-03']=>'working',
    ['2013-05-04']=>'future test');

$array2 = array(
    ['2013-05-01']=>'1',
    ['2013-05-02']=>'done',
    ['2013-05-03']=>'code',
    ['2013-05-05']=>'release');

我想加入这些数组,这样输出就是

$result = array(
        ['2013-05-01']=>'test 1', 
        ['2013-05-02']=>'testing 2',
        ['2013-05-03']=>'working code',
        ['2013-05-04']=>'future test',
        ['2013-05-05']=>'release')

我试过 $result = $array1 + array2; array_merge() , array_combine() 都没有给出正确的结果。

你能帮帮我吗?

【问题讨论】:

  • 您需要编写自己的代码来执行此操作。没有内置函数。
  • 你的意思是使用foreach循环?
  • 令我惊讶的是,人们期望 PHP 有一个内置函数,适用于初学者应该能够毫不费力地解决的每一个场景。
  • function array_join($arr1, $arr2) {return array(['2013-05-01']=>'test 1', ['2013-05-02']=>'testing 2',['2013-05-03']=>'working code');} - 只是搞砸了;)
  • 您给定的代码甚至无法正确编译。

标签: php arrays


【解决方案1】:

array_walk() 是最简单的方法。

【讨论】:

    【解决方案2】:

    最好为它写一个函数并保存在你的工具包中:

    function merge_array() {
        $merged = array();
        $arrays = func_get_args();
    
        if ($arrays) {
            foreach ($arrays as $array) {
                foreach ($array as $key => $value) {
                    if (isset($merged[$key])) {
                        $merged[$key] .= ' ' . $value;
                    }
                    else {
                        $merged[$key] = $value;
                    }
                }
            }
        }
    
        return $merged;
    }
    

    现在将$array1$array2 传递给它:

    $result = merge_array($array1, $array2);
    

    你会得到这样的结果:

    // Array
    // (
    //     [2013-05-01] => test 1
    //     [2013-05-02] => testing done
    //     [2013-05-03] => working code
    //     [2013-05-04] => future test
    //     [2013-05-05] => release
    // )
    

    请注意,如果您愿意,此函数可以接受两个以上的数组

    【讨论】:

      【解决方案3】:

      你可以使用array_walk():

      $result = $array1;
      array_walk($result, function(&$value, $key) use (&$array2) {
          $value .= ' ' . $array2[$key];
      });
      

      Demo

      这会根据数组键将$result(从$array1 复制)原地修改为从$array2 查找的值。

      【讨论】:

        【解决方案4】:
        foreach($array2 AS $key => $value)
        {
            $array1[$key] = isset($array1[$key]) ? $array1[$key] . " " . $value : $value;
        }
        

        【讨论】:

        • 错误处理是为了什么?处理 $array1 不包含 $array2 的键的情况。
        • 建议使用isset()而不是empty()
        • 好建议。如果 $array1 包含一个 '0' 作为值,它会以这种方式被删除。
        • @zerkms 有很多empty() 电话? :)))empty($array1[$key])建议为isset($array1[$key])
        • 这具有修改$array1的潜在意外副作用。
        【解决方案5】:

        这里有一个解决问题的方法:

        $array1 = array(
            '2013-05-01'=>'test',
            '2013-05-02'=>'testing',
            '2013-05-03'=>'working',
            '2013-05-04'=>'future test');
        
        $array2 = array(
            '2013-05-01'=>'1',
            '2013-05-02'=>'done',
            '2013-05-03'=>'code',
            '2013-05-05'=>'release');
        
        
        $r = array_map(function($i) {
            return !is_array($i) ? $i : implode(' ', $i);
        }, array_merge_recursive($array1, $array2));
        
        var_dump($r);
        

        在线演示:http://ideone.com/wmbple

        【讨论】:

        • 该死的,我花了 5 分钟在蹩脚的 iPad 软键上打字,只是为了让一些懒鬼用真正的键盘打败我。
        • @Niels Keurentjes:“只是为了让一些懒鬼用真正的键盘打败我”——“懒鬼”?是开玩笑吗?
        • @NielsKeurentjes 对于在 iPad 上输入答案的人来说,谁是懒惰者值得商榷 =p
        • @Jack 你试过吗?所有的卷曲和所有东西都隐藏在每个后面,就像每个 5 次按键一样,你必须处理 Apple 的大写想法:P
        猜你喜欢
        • 2018-12-09
        • 2016-07-09
        • 1970-01-01
        • 1970-01-01
        • 2015-12-18
        • 2021-12-13
        • 2017-04-13
        • 1970-01-01
        • 2012-10-17
        相关资源
        最近更新 更多