热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php将两个数组相同的key合并到一个数组

{代码...}我的方案:有更好的吗?O(∩_∩)O谢谢{代码...}
$arr = array(
    array(
    'id' => 1,
    'user_name'=>'test1'
    ),
    array(
    'id' => 2,
    'user_name'=>'test2'
    ),
    array(
    'id' => 3,
    'user_name'=>'test3'
    )
);
$arr2 = array(
     array(
    'id' => 1,
    'shop_name'=>'shop1'
    ),
    array(
    'id' => 5,
    'shop_name'=>'shop2'
    ),
    array(
    'id' => 3,
    'shop_name'=>'shop3'
    )
);
怎么根据2个数组id相同的一维数组,将$arr2的shop_name添加到$arr,如果没有相同的id,shop_name为空,形成如下数组:
$good_arr =array(
    array(
    'id' => 1,
    'user_name'=>'test1',
    'shop_name'=>'shop1'
    ),
    array(
    'id' => 2,
    'user_name'=>'test2',
    'shop_name'=>''
    ),
    array(
    'id' => 3,
    'user_name'=>'test3',
    'shop_name'=>'shop3'
    )

);

我的方案:有更好的吗?O(∩_∩)O谢谢

    /*foreach($arr as $key => &$value) {
        $value['shop_name']='';
    }
        unset( $value );
        */
    foreach($arr as $k2 =>&$v2) {
            $v2['shop_name']='';
        foreach($arr2 as $k =>$v) {
            if($v2['id'] == $v['id']) {
            $v2['shop_name'] = $v['shop_name'];
            }
        }
    }
    print_r($arr);

回复内容:

$arr = array(
    array(
    'id' => 1,
    'user_name'=>'test1'
    ),
    array(
    'id' => 2,
    'user_name'=>'test2'
    ),
    array(
    'id' => 3,
    'user_name'=>'test3'
    )
);
$arr2 = array(
     array(
    'id' => 1,
    'shop_name'=>'shop1'
    ),
    array(
    'id' => 5,
    'shop_name'=>'shop2'
    ),
    array(
    'id' => 3,
    'shop_name'=>'shop3'
    )
);
怎么根据2个数组id相同的一维数组,将$arr2的shop_name添加到$arr,如果没有相同的id,shop_name为空,形成如下数组:
$good_arr =array(
    array(
    'id' => 1,
    'user_name'=>'test1',
    'shop_name'=>'shop1'
    ),
    array(
    'id' => 2,
    'user_name'=>'test2',
    'shop_name'=>''
    ),
    array(
    'id' => 3,
    'user_name'=>'test3',
    'shop_name'=>'shop3'
    )

);

我的方案:有更好的吗?O(∩_∩)O谢谢

    /*foreach($arr as $key => &$value) {
        $value['shop_name']='';
    }
        unset( $value );
        */
    foreach($arr as $k2 =>&$v2) {
            $v2['shop_name']='';
        foreach($arr2 as $k =>$v) {
            if($v2['id'] == $v['id']) {
            $v2['shop_name'] = $v['shop_name'];
            }
        }
    }
    print_r($arr);

我写了个时间复杂度O(n) 比你的时间短
空间复杂度则要多一点

 1,
    'user_name'=>'test1'
    ),
    array(
    'id' => 2,
    'user_name'=>'test2'
    ),
    array(
    'id' => 3,
    'user_name'=>'test3'
    )
);
$arr2 = array(
     array(
    'id' => 1,
    'shop_name'=>'shop1'
    ),
    array(
    'id' => 5,
    'shop_name'=>'shop2'
    ),
    array(
    'id' => 3,
    'shop_name'=>'shop3'
    )
);

$tmp = '';
foreach ($arr2 as $k) { $tmp[$k['id']] = $k; }
foreach ($arr as &$v) {
    $sn = $tmp[$v['id']]['shop_name'];
    $sn = $sn ? $sn :'';
    $v['shop_name'] = $sn;
}

var_dump($arr);

?>

PHP5.5支持一个很棒的函数array_column()非常适合干这个事情,具体请参考手册:http://cn2.php.net/manual/zh/function.array-column.php。

$shop_name = array_column($arr2, 'shop_name', 'id');
foreach($arr as $key => $item) {
    $exist = array_key_exists($item['id'], $shop_name);
    $arr[$key]['shop_name'] = $exist ? $shop_name[$item['id']] : '';
}
print_r($arr);

以上代码没有经过测试(因为我本地也没5.5版本的PHP),写法上可能也略丑,但是主要是想介绍一下array_column()这个函数。

如果是用循环做的话,你那样写也是没有问题的,但是我依旧是“能不用嵌套循环就坚决不用嵌套循环”的想法。

$shop_name = array();
foreach($arr2 as $item) $shop_name[$item['id']] = $item['shop_name'];

foreach($arr as $key => $item) {
    $exist = array_key_exists($item['id'], $shop_name);
    $arr[$key]['shop_name'] = $exist ? $shop_name[$item['id']] : '';
}

print_r($arr);

题外问一句吧,题主你怎么总是在问这种PHP的数组操作问题啊,这种东西查查文档仔细想想就能出来的东西实在是有点....我就不多说什么了。

function filter($item) 
{
    return count($item) == 3 ? $item : false;
}

$newArr = array_filter(array_merge($arr, $arr2), 'filter');

题主实在不好意思,上面这个回答我弄错了 array_merge 的用法,现在重写一个,已本机测试:

$tempArr = array();
foreach($arr2 as $item) 
    $tempArr[$item['id']] = $item['shop_name'];

foreach($arr as $k => $v) {
    if(array_key_exists($v['id'], $tempArr)) { 
        $arr[$k]['shop_name'] = $tempArr[$v['id']];
    } else {
        $arr[$k]['shop_name'] = '';
    }
}
$newArr = $arr;

btw,我以前也喜欢写嵌套循环,因为逻辑比较简单,但是自从 @公子 指正后,我已经开始尽量避免这种效率极低的写法,希望答案能帮到题主!:)

推荐阅读
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • PHP玩家基地系统毕业设计(附源码、运行环境)的用户登录界面、游戏管理和玩家作品管理
    本文介绍了一个PHP玩家基地系统的毕业设计,包括用户登录界面、游戏管理和玩家作品管理等功能。附带源码和运行环境,并提供免费赠送本源代码和数据库的方式,请私信获取详细信息。摘要共计约XXX字。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了《中秋夜作》的翻译及原文赏析,以及诗人当代钱钟书的背景和特点。通过对诗歌的解读,揭示了其中蕴含的情感和意境。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文描述了作者第一次参加比赛的经历和感受。作者是小学六年级时参加比赛的唯一选手,感到有些紧张。在比赛期间,作者与学长学姐一起用餐,在比赛题目中遇到了一些困难,但最终成功解决。作者还尝试了一款游戏,在回程的路上感到晕车。最终,作者以110分的成绩取得了省一会的资格,并坚定了继续学习的决心。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
author-avatar
十九世纪末的伦敦_371
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有