php怎么改数组下标,PHP获取数组最后一个值?
引言
我们对于 PHP 的数组操作乐此不疲,为什么?因为 PHP 编程你几乎时时刻刻都在于数组打交道,对于数组的操作熟练程度,很大一部分因素关系着代码的优劣。
今天我们来说说,如何获取数组的最后一个元素,并且不删除它。
不要小看这个需求,没准儿你还做不对呢 :)
学习时间如果你首先想到了 array_pop,那很不幸,这个函数可以获取最后一个元素,却把数组更改了。
array_pop 弹出并返回 array 数组的最后一个单元,并将数组 array 的长度减一。如果 array 为空(或者不是数组)将返回 NULL。 此外如果被调用不是一个数则会产生一个 Warning。
这显然不是我们要的结果。
其实实现一个需求的方法是多种多样的,我们尝试使用 10 种不同的办法,来做到这一点。
$x = array_values(array_slice($array, -1))[0]
第一种,使用 array_slice 截取数组 $array 倒数第一个元素。返回的是一个数组。然后使用 array_values 重新编排索引值。因为数组只有一个元素,那么索引值必然是 0。原数组 $array 毫发无损。
$x = array_slice($array, -1)[0];
第二种方法没有考虑关联数组的情况,有可能索引 0 不存在。所以容错性不好。
$x = array_pop((array_slice($array, -1)));
第三种方法,终于用到了 array_pop。不过是在 array_slice 阶段的数组上使用。
$x = array_pop((array_slice($array, -1, 1)));
第四种方法,简直是有魔性了,比第三种办法相比,只是在 array_slice 截断的长度手动指定为 1。
$x = end($array); reset($array);
第五种方法,用到数组指针了。end 返回最后一个元素。然后需要手动恢复指针位置到头部,所以调用了一次 reset 函数。本方法有可能返回关联数组,而不能拿到值。
$x = end((array_values($array)));
第六种方法,严格地为了返回最后一个元素的值,使用 array_values 进行了索引重新编排。
$x = $array[count($array)-1];
第七种方法,直接使用索引了。肯定是假设数组都是默认递增索引的数组,所以 count 获取的长度才有效。该方法容错性差。
$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
第八种方法,是对第七种的不足的修复。
$x = $array[] = array_pop($array);
第九种方法,我们需要明白,使用连等复制,array_pop 弹出数组的最后一个元素后,同时赋值给 $x。这没问题。赋值给原数组 $array[],这会对关联数组重新排定索引,所以有副作用。
$x = $array[array_key_last($array)];
第十种,这种方法的容错性也极高,因为使用了 array_key_last,有效地考虑了关联数组的情况,而且结果也很取巧。这个方法很棒。但是只有 PHP 7.3 以上的版本才有。
写在最后好了,大家好好消化一下上面10个方法的优劣,取长补短,深度学习吧。
Happy coding :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。
PHP多维数组根据值搜索对应的键?
引言
我们讲解了很多种PHP数组操作的引用场景。今天我们接着分享这方面的知识,说一说对于多维数组,如何根据值搜索,并返回数组的索引值。
学习时间最开始我们习惯于跟随本能写代码,下意识地开始用 for 循环,对数组进行遍历,然后挨个比对,如果值相等,就返回索引值,如果没有匹配上,就是不存在。
假如原始数组是如下图一样的关联数组。
程序逻辑很简单,我们使用代码实现一下:
function searchForId($id, $array) { foreach ($array as $key => $val) { if ($val['uid'] === $id) { return $key; } } return null; }
这个函数接收一个值,与数组,如果匹配上就将数组的索引返回,如果不存在则返回 null。因为第一层结构没有手动指定索引值,所以默认是从0开始的数字索引。
使用起来是这样的:
$id = searchForId('100', $userdb);
执行结束后,输出应该为0。
当然了,上面写的函数具有通用性,对于特殊的案例,我们应该随机应变。对于上述 $userdb 关联数组的结构,显然,使用PHP内置的函数操作起来,更为直观和快捷。
我们只需要先把 uid 列的元素全部取出,因为上层结构是默认数字索引,所以此处不用手动指定索引值;然后,在提取的数组中搜索值,使用 array_search 执行返回键。
总结为代码,就一行:
$key = array_search('100', array_column($userdb, 'uid'));
执行结果跟上面的 searchForId 函数一致。
深入讨论上面的函数和第二个解决方法会有问题,就是仅仅返回了第一个匹配的键。像下面这样写,肯定问题不大:
$key = array_search(40489, array_column($userdb, 'uid'));
但是如果在数组中有重复的值,而 uid 列也不唯一,要把所有的匹配结果都返回,该怎么做呢?不会又要修改 searchForId 函数,重新倒腾?
其实大可不必,PHP提供了这样的功能,只需改用 array_keys 函数即可:
$keys = array_keys(array_column($userdb, 'uid'), 40489);
你肯定经常使用 array_keys 函数用于返回整个数组的键,但是它的第二个参数,恰恰是在指定时,拥有可搜索的功能。这确实有些冷门。
再进一步。
上面返回的是数组对应的键,那如果想要键和值一并关联返回,一行代码能搞定吗?可以的,修改一下就行了,使用 array_combine 函数将键和值组装起来返回:
$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, 'uid')),40489);
写在最后本文通过特定的数组搜索需求,延伸到手动造轮子,把特殊的特性推向一般,并使用PHP内置的数组处理函数,进行功能裁切,简洁而高效。善用数组函数是硬功夫。
Happy coding :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。
歌词里面加照片怎么拍摄?
可以按照以下步骤进行:
1. 准备工作:准备好需要添加的照片、相机或手机以及相应的数据线。
2. 拍摄照片:使用相机或手机拍摄需要添加的照片,可以根据歌曲的主题和氛围来选择合适的拍摄场景和角度。拍摄后将照片保存到电脑或手机中。
3. 选择歌曲:在选择歌曲时,需要注意歌曲的格式和支持的歌词格式,一般来说,MP3和MP4等格式的歌曲都支持歌词里面添加照片。
4. 准备歌词:在准备歌词时,需要注意歌词的格式和支持的标签格式,一般来说,LRC和KSC等格式的歌词都支持添加图片标签。
5. 添加图片标签:使用文本编辑器打开歌词文件,找到需要添加照片的时间点,例如在歌曲的某个旋律高潮处,可以在该时间点前后添加以下文本:
[ar:歌手名]
[ti:歌曲名]
[al:专辑名]
[00:01.20]歌词内容
[00:10.00][图片:图片路径]
其中,[图片:图片路径]表示要添加照片的标签,图片路径需要填写图片文件的路径,可以是相对路径或绝对路径。
6. 保存歌词文件:保存修改后的歌词文件,并将照片文件和歌词文件放在同一目录下。
7. 播放歌曲:使用支持歌词显示的音乐播放器播放歌曲,可以在歌词出现的时间点看到添加的照片。
注册登录功能模块怎么实现的?
注册登录功能模块是Web应用程序中非常常见的功能之一,它通常包括以下步骤:
1. 用户注册:用户通过输入用户名、密码、电子邮箱等信息进行注册,此时需要对用户输入的信息进行有效性验证和安全性验证,例如检测用户名是否重复、密码是否符合强度要求、输入的验证码是否正确等。
2. 用户登录:用户输入账号和密码进行验证,验证成功后可以进入到Web应用程序的其他功能模块,如个人中心、购物车等。
实现注册登录模块需要考虑以下几个方面:
1. 后端数据库的设计:需要设计合理的数据库表结构,保存用户信息,包括用户名、密码、电子邮箱等字段。通常,密码不会明文保存,而会加密存储。数据库还需要添加索引来加快查询速度,提高系统性能。
2. 安全性:为保证用户数据安全,需要对用户输入做有效性验证和安全性验证。例如,用户名和密码需要输入提示信息,密码需要包含大小写字母、数字、特殊符号等,还可能需要使用加密算法进行数据加密,以防止数据泄露。
3. 前端页面设计:注册和登录页面需要具备良好的用户体验,要美观简洁,易于操作。
4. 通信安全:注册和登录通信需要使用SSL或其它安全协议进行加密,以防止数据被篡改或截获。
5. 服务端接口设计:服务端需要提供注册和登录的相关接口,以支持前端交互操作。注册时需要向服务端发送注册请求,服务端会将接收到的信息写入数据库,在注册成功后返回成功状态码,注册失败则返回失败状态码及错误信息。登录时需要向服务端发送登录请求,服务端根据用户名和密码进行验证,验证成功则返回成功状态码,并发送Token给客户端,客户端需要在每次请求时带上这个Token,以保证登录状态。
6. 验证码:在注册和登录过程中,需要使用验证码进行验证,以防止恶意攻击。验证码的生成采用随机方式,通过服务端和客户端之间的通讯进行验证。
综上所述,注册登录功能模块的实现,既需要考虑用户体验,也需要保证系统的安全性和稳定性。要完成这一任务,需要设计合理的数据库和服务器,添加有效性和安全性验证机制,并且处理好前后端的通信和数据加密。
PHP如何实现删除数组元素和重新索引?
如果要在某个数组中删除一个元素,可以直接用的unset
<?php $arr = array('a','b','c','d'); unset($arr[1]); print_r($arr); ?> print_r($arr)
之后,结果却不是那样的,最终结果是 Array ( [0] => a [2] => c [3] => d )
那么怎么才能做到缺少的元素会被填补并且数组会被重新索引呢?答案是
array_splice():
<?php $arr = array('a','b','c','d'); array_splice($arr,1,1); print_r($arr); ?>
print_r($arr)之后,结果是A(www.111cn.net)rray ( [0] => a [1] => c [2] => d )
删除数组指定元素
array_search()比较实用
array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false$array = array('1', '2', '3', '4', '5');$del_value = 3;unset($array[array_search($del_value , $array)]);//利用unset删除这个元素print_r($array);输出array('1', '2', '4', '5');
但这种如果要重新索引数组就需要利用foreach遍历删除的数组之后重新建立一个数组这样也是可以的。