php数组怎么遍历,PHP数组任意位置插入任意元素?
引言
本文我们聊一聊 PHP 数组,如何在任意位置插入新元素。因为内置函数并没有提供类似 array_insert(&$array, $pos, $items) 的函数,所以我们试着动手解决。
学习时间标准的实现方法,是要用 array_splice,该函数的用法:
array array_splice( array &$input, int $offset[, int $length = 0[, mixed $replacement]] )
把 input 数组中由 offset 和 length 指定的单元去掉,如果提供了 replacement 参数,则用其中的单元取代。
下面是举例说明:
$original = array( 'a', 'b', 'c', 'd', 'e' ); $inserted = array( 'x' ); // $inserted 并不必须是数组 array_splice( $original, 3, 0, $inserted ); // 在索引 3 位置插入 // $original 内容为 a b c x d e
有几个关键点大家需要注意,灵活运用 $offset, $length, $replacement 三个参数,可以组装成强大的功能。
对于偏移位置 $offset:
如果 offset 为正,则从 input 数组中该值指定的偏移量开始移除。如果 offset 为负,则从 input 末尾倒数该值指定的偏移量开始移除。对于替换的长度 $length:
如果省略 length,则移除数组中从 offset 到结尾的所有部分。如果指定了 length 并且为正值,则移除这么多单元。如果指定了 length并且为负值,则移除从 offset 到数组末尾倒数length 为止中间所有的单元。在编程中,当给出了replacement 时要移除从 offset 到数组末尾所有单元时,用 count($input) 作为 length。比如像下面这个示例:
$input = array("red", "green", "blue", "yellow"); array_splice($input, 1, count($input), "orange"); // $input = array("red", "orange")
特别需要注意的是 $replacement 参数:
如果给出了 replacement 数组,则被移除的单元被此数组中的单元替代。如果 offset 和 length 的组合结果是不会移除任何值,则 replacement 数组中的单元将被插入到 offset 指定的位置。 注意替换数组中的键名不保留。如果用来替换 replacement 只有一个单元,那么不需要给它加上array(),除非该单元本身就是一个数组、一个对象或者 NULL。亲手造轮子上一节的解决方案堪称标准。有些同学还是要忍不住造轮子。“条条大道通罗马”,肯定有不止一种方式实现需求。下面是另外一种方式:
$a = array(1, 2, 3, 4); $b = array_merge(array_slice($a, 0, 2), array(5), array_slice($a, 2)); // $b = array(1, 2, 5, 3, 4)
使用 array_slice 函数对原数组切片,一分为二,然后使用 array_merge 拼接3个部分。完美!
上面的代码,在使用 array_merge 后悔丢失原数组的索引关系。如果要保留,使用 + 连接:
$b = array_slice($a, 0, 2) + array(5) + array_slice($a, 2);
这样就可以了。
换汤不换药,如果给类添加一个方法,或者添加一个助手函数,自然是极好的。下面是封装函数。
function array_insert(&$array, $value, $index) { return $array = array_merge(array_splice($array, max(0, $index 1)), array($value), $array); }
写在最后本文介绍了一个功能丰富的 array_splice 函数,让大家领略了参数的灵活运用所带来的便捷。如果你经常需要这样的操作,麻溜地写到全局助手函数里吧。
Happy coding :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。
如何看待PHP一定要会算法吗?
作为一名优秀的高级程序员,懂数据结构和算法是非常重要的,并且软件工程方面经验知识的重要性丝毫不亚于此,特别是有志于更高追求的程序员。
了,但是一些简单的数理统计要会吧,最小二乘法能不能看懂要看你从事的具体领域了;英语,学好了自然好,但是现在基本的书籍都是有中文的,一点儿都不辛苦,如果不求了解最新的前沿的知识也不求StackOverflow上刷分,英文能力还能要求多高呢?想向往高级程序员发展,很有必要要学习数据结构和算法,就像BAT这样的企业是很注重这个能力的。
Consistent Hashing原理示意图
PHP程序员对数据与算法有什么要求,需要了解些什么?
对于初级php程序员而言,算法、数据结构、语文数学英语基础都非常非常重要,同时软件工程类课程也一定要学好。
第一:数据结构具体指同一类数据元素中,各元素之间的相互关系。
数据结构包括三个组成成分,数据的逻辑结构,数据的存储结构和数据运算结构。数据结构作网络性能优化时很有用,比如HASH算法和B+算法都得知道下原理才能知道他效果如何。
第二:php程序员会算法能力其实对网页游戏有很大用处
算法能力对网页游戏的开发业很有帮助,一套强大的算法可以让你游戏时,数据处理得无懈可击,php还是有些大用处的,不过想拿高工资英语也学好点,php开发快且高效安全。
其次:使用php实现的基本的数据结构和算法,什么二叉树、二叉搜索树、、B树、链表和常见排序、搜索算法等等,而且全部是使用来实现的,PHP老程序员说的有理,“PHP主要还是快速开发,各种现成的函数和类足够你用的了,对于这些相对底层的东西不是必须掌握”
P.S:数据结构是基础,链表、二叉树、哈希、排序算法等,你可能在写PHP代码的时候,不一定能够用上,但是,掌握它们能让你对程序的运作原理有更深的理解。举个简单的例子说下数据结构对php的用处:我们经常使用PHP数组,PHP数组不仅可以foreach的方式遍历,又能通过key-value的方式访问,我们都觉得很便利,那么问题来了,为神马会这样?
答:原因是PHP5的数组是个HashTable(哈希表,支持key-value直接映射),并且元素之间又用双向链表连接起来(支持遍历)。如果,同学们不学习数据结构,连链表和hash都不知道,就更谈不上理解内部的运作原理。其实这个只是数据结构应用的冰山一角,想对技术有深一些的理解,学好数据结构很有必要。而更好地掌握原理层,又可以促进我们对程序的优化和思考,采用更节省系统资源的方式完成我们的业务需求。
P.S:对于程序员来说数据结构这个还是学的,还可以按照“HTML →CSS →Java →数据库”的顺序来学,可以多看看php的书籍,比如:PHP 和MYSQL web开发,这是php的圣经。
如果要成为一个软件工程师,是不是必须学会算法和数据结构?
简单的数据结构是一定要会的,栈和队列不能不会吧。希望一直在这行业一直做下去并希望有所突破,就必须得深入学习,循序渐进不用着急。
关于算法和数据结构要学习的:
首先算法要学的有::图搜索、排序、Prim / Kruskal (最小生成树)、Dijkstra (最短路径算法)、正则表达式和字符串匹配、
其实数据结构要学习的有:图、树、堆、队列。
php程序员如果想做游戏的话可以学一下A*算法,四八叉树场景管理等。
曾经,有个公式,算法+数据结构=程序,所以嘛,想当好的程序员,算法和数据结构是基本功,不得不学好。其次,程序不够了,变软件了,多次的返工重构造就了软件工程,想脱离软件蓝领的人,必须要懂软件工程。再后来,软件也不够了,变系统了,这个麻烦哪!最头疼的莫过于用户一看你交付的,说人家想要的根本不是这个,真正牛逼的人,都在需求工程上有过人之处。问题很好,路自己选。
语数英不好的人学算法和数据结构会不会很辛苦??如果说英语不好就不能学,数学不好就不能学。大家是不是就不学了?如果说数据结构不重要,算法不重要。大家是不是就不学了?
P.S:“今朝有酒今朝醉,莫使金樽空对月”,不要活在别的眼里,这边没有那么多要求,还是跟着工作走,如果你的工作用到了,就学习。到那时候,你的基础已经蛮扎实了,就像武侠里的,当你内功足了,就会接触更高层次。先搞定工作,业余时间有针对的学习。
怎样批量把文件夹内的图片名称提取出来?
确保文件夹文件不多,且用的是php5,那么用scandir得到文件名的数组,然后遍历数组,取其中的图片文件名整理输出。否则的话就用opendir打开文件夹,然后readdir,判断、整理。整体来说,第一种方法简单,容易掌握。但第二种方法明显效率会高些,特别是在文件多的情况下。
PHP中如何使用foreach循环遍历数组求681043中的最大值和最小值?
不需要使用 foreach 就能从数组 6、8、10、4、3 求出最大最小值,可以使用以下代码:
redis怎么存数组和获取数组?
有两种方法:
1.把要存的数组序列化 或者 json_encode后 变成字符串再存。取的时候 反序列号或者json_decode处理成数组。
2.可以使用hash结构,以key作为1维,以hash中的field作为第二维。redis 如何操作多维数组?1.Redis用list这种一维数组来模拟二维。
2.序列化一下保存的数据,在原有的hset跟hget的基础上新增了两个方法 setArr跟getArr 调用 hset hget 用来保存多维数组的情况,这两个方法是在存之前,取之后都进行序列化操作。
3.用redis存多维数组,可以把数组json_encode转换成json各式数据,以string类型的方式存储。读取的时候再json_decode回来。
4.Redis本身不支持存取PHP数组的数据结构,但是如何存取PHP的数组呢?可以把数组序列化,以字符串的形式缓存到Redis中。
5.以使用hmset把PHP数组保存为hash类型的数据,使用hmget读取一维的键没问题,读取二维的多维的键就返回false。