Php数组函数中的那些什么sort排序函数是不是很乱? 可以这样看。以及php搜索给定的值在数组中最后一次出现的位置的实现思考

一、Php数组函数中的那些什么sort排序函数是不是很乱? 可以这样看

    PHP的数组函数真不少,甚至对一个程序员来说,在其整个程序生涯中有些方法他永远也不会用上。不过每一个方法都有其价值、或者在出现的时候有其价值。所以偶尔有空时还是可以去看看。在这些方法中比较烦的估计就是这些什么sort之类的函数吧。asort,ksort,rsort,krsort等等,看起来真的比较乱,复制粘贴一下,看下面总共12个函数,可以归为2类。一个是简单的排序函数共9个,剩下的3个主要涉及自然排序,估计在对一些涉及字母+数字的文件名排序上比较有用。函数列表如下:

#. 简单排序函数

arsort — 对数组进行逆向排序并保持索引关系
asort — 对数组进行排序并保持索引关系
sort — 对数组排序
uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
uksort — 使用用户自定义的比较函数对数组中的键名进行排序
usort — 使用用户自定义的比较函数对数组中的值进行排序
krsort — 对数组按照键名逆向排序
ksort — 对数组按照键名排序
rsort — 对数组逆向排序

#. 其它排序函数

natsort — 用“自然排序”算法对数组排序
natcasesort — 用“自然排序”算法对数组进行不区分大小写字母的排序
array_multisort — 对多个数组或多维数组进行排序

函数一看基本也明白意思,不过在对上面9个排序函数看的时候,是不是能发现它们之间有些联系,但好像又挺乱的?是的,有点乱。所以我把上面9个函数画成了一个图,比较直观,如下:

5ae249480811df6ce89d5860b4e47e3e.png

    上图能比较清楚地展示这9个sort函数之间的关系,可看到从sort基础排序函数出发,可以向四个方向演变,包括降序排序、以键名排序、以用户函数排序和保持索引关系进行排序。然后ksort和rsort合并到krsort; asort和rsort合并到arsort; usort和asort合并到uasort; ksort和usort合并到uksort。 这样一看是不是少了几个合并分支呢?是的。这四个方向排列组合应该有6种可能,还剩下两种组合:

1,asort和ksort的合并:想像一下,使用ksort是使用键名进行排序,本身就会保持索引关系,这正是asort的功能,所以不会存在这种合并。

2,usort和rsort的合并:这种组合看起来的确是合理的,不过有点多余,因为usort本身是用户自定义的索引排序,升序降序在自定义函数中即可以通过比较关系来实现。所以也没有这种合并。

    故排序函数就只有9种了。

二、php搜索给定的值在数组中最后一次出现的位置

    php的数组函数很多,功能也很强大,但如果要想实现搜索给定的值在数组中最后一次出现的位置,Php数组中可真是没有这样的函数。例如要在$array数组中查找789值(不区分类型),可以使用什么方法呢?最low的当然可以使用循环,循环之后最后一次赋值即获取到了最后一个KEY。代码如下:

<?php
#给定一个变量
$needle = 789;

#给定待查询的数组
$array = array('hello', '1', 789,'this is a test', 'another', 789, array('array', 'funcion'), '789', 'the same type', '789');

#使用循环的方法
$key = false;
foreach($array as $k=>$v){
   $v == $needle && $key = $k; 
}
var_dump($key);

    但我们要熟练使Php、深入使用Php,一定要更多的利用php已有的方法和功能,不然即便编程多年,也会觉得自己懂得很肤浅。PHP的数组函数中虽然没有直接实现搜索给定的值在数组中最后一次出现的位置的函数,但是可以结合已有的数组函数来使用。说到这里你也许想到了php里面有一个array_search函数能直接用,不过很遗憾, 使用array_search函数搜索,即使要搜索的值在被搜索的数组中出现不止一次,array_search只返回第一个匹配的键。 所以只使用array_search是不行的。但我们还是可以利用array_search函数的。如下我们可以先得到一个数组单元顺序相反的数组,再用array_search函数搜索即能实现。代码如下:

<?php
#需要注意array_reverse需要使用第二个参数来保持索引关系
var_dump(array_search($needle, array_reverse($array, true)));

还有没有别的办法呢?还有的。还有一个array_keys函数,这个函数一般用于返回 input 数组中的数字或者字符串的键名。 但它第二个参数也可以实现指定搜索值,从而只返回该值的所有键名。

<?php
#结合使用end和array_keys函数来实现
var_dump(end(array_keys($array, $needle)));

 还有没有别的办法呢?想了一下,还有的。

<?php
#使用array_flip先交换数组中的键和值,然后直接判断是否有要查找值为needle的key.
$temparr = array_flip($array);
var_dump($temparr[$needle]??false);

    还有没有别的办法呢?哈哈,我没有想到,欢迎补充。

    上面的方法虽然都可行,但有的是有一定限制的。array_flip操作中数组的值需要能够作为合法的键名,它必须是 integer 或者 string。如果值的类型不对将发出一个警告,并且有问题的键值对将不会反转。并且上面的示例中查找的时候是不考虑类型的,如果考虑类型,最后使用array_flip的方法就不可以了。而array_search函数和array_keys都可以通过第三个参数指定是否是strict检查模式,从而仍可以使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值