php怎么表示空数组,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 :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。
PHP中数据类型array和object有什么区别?
具体的概念区别你可以查看php帮助手册,我说下个人的理解:通常来说,array是数组,而object是对象,两者有很大的区别,最主要的区别我觉得对象一般要定义行为,其目的是为了封装,而数组主要定义数据结构。但这两种在php语言里区别比较模糊,因为php是支持范数据类型,所以array可以是object,反之亦然。
php中系统有最大值函数吗?
php中使用max()函数来求最大值,可以求一个数组中所有元素的最大值,也可以求一串数字的最大值。
max()函数有两种用法来求最大值。
1、求数组的中最大值元素。
max($arr),求$arr数组元素中的最大值。这种情况下,只能有一个参数,且必须是数组。
2、求多个数字中的最值。
max(x,y,z,z1,z2,z3...);
这种情况下,必须有两个参数。一般来说,参数都必须是数字。如果真的出现了string类型的参数,max()函数会把它当作0来处理。再如果有多个string类型的数组,且0是所有数字中的最大值,那么将返回按字母排序最小的string参数。
php如何按顺序排列数组?
PHP 数组的排序函数
在本节中,我们将学习如下 PHP 数组排序函数:
sort() 以升序对数组排序
rsort() 以降序对数组排序
asort() 根据值,以升序对关联数组进行排序
ksort() 根据键,以升序对关联数组进行排序
arsort() 根据值,以降序对关联数组进行排序
krsort() 根据键,以降序对关联数组进行排序
php如何判断SQL语句的查询结果是否为空?
PHP与mySQL这对黄金搭档配合的相当默契,但偶尔也会遇到一些小需求不知道该怎么做,例如今天要谈到的:如何判断sql语句查询的结果集是否为空!
我们以查询学生信息为例,来看看究竟如何实现我们的需求。
首先,来看看我们的数据表“student”中所存储的数据是个什么样子;
id stuname gender age grade class
1 张三 男 16 17 3
2 李四 男 15 18 2
3 王美丽 女 16 17 5
我们来看看sql查询功能代码,我们要将年龄为16岁的学生信息都查出来;
<?php
$sql = "select * from `student` where `age`='16';";
$rows = mysql_query($rs);
?>
<ul>
<?php
while($rows=mysql_fetch_array($rs)){
?>
<li>姓名:<?php echo $rows['stuname'];?></li>
<li>性别:<?php echo $rows['gender'];?></li>
<li>年龄:<?php echo $rows['age'];?></li>
<li>年级:<?php echo $rows['grade'];?></li>
<li>班级:<?php echo $rows['class'];?></li>
<?php
}
?>
</ul>
以上便是查询功能,当结果集不为空时,一切正常,当数据集为空时,会得到一个空白的ul标签,
作为使用者却不知道为什么没有得到数据,此时我们需要给用户一个提示信息,那么我们就需要判断这个结果集是否为空!
如何才能判断结果集是否为空呢,有下面两个方法:
<?php
//方法一 获取select结果集的行数
$rows=mysql_query("select * from `student` where `age`='16';");
if (mysql_num_rows($rows) < 1){
echo '查询无数据!';
}
//方法二 返回上一次操作受影响的行数
$rows=mysql_query("select * from `student` where `age`='16';");
if(!mysql_affected_rows()){
echo '查询无数据!';
}
?>
知道了方法,那么把方法套到我们的代码中看看效果吧
//方法一
<?php
$sql = "select * from `student` where `age`='16';";
$rows = mysql_query($rs);
?>
<ul>
<?php
if (mysql_num_rows($rs) < 1){
echo '查询无数据!';
}else{
while($rows=mysql_fetch_array($rs)){
?>
<li>姓名:<?php echo $rows['stuname'];?></li>
<li>性别:<?php echo $rows['gender'];?></li>
<li>年龄:<?php echo $rows['age'];?></li>
<li>年级:<?php echo $rows['grade'];?></li>
<li>班级:<?php echo $rows['class'];?></li>
<?php
}
}
?>
</ul>
//方法二
<?php
$sql = "select * from `student` where `age`='16';";
$rows = mysql_query($rs);
?>
<ul>
<?php
if(mysql_affected_rows()){
while ($rows=mysql_fetch_assoc($rs)){
?>
<li>姓名:<?php echo $rows['stuname'];?></li>
<li>性别:<?php echo $rows['gender'];?></li>
<li>年龄:<?php echo $rows['age'];?></li>
<li>年级:<?php echo $rows['grade'];?></li>
<li>班级:<?php echo $rows['class'];?></li>
<?php
}
}else {
echo "查无数据!";
}
?>
</ul>
OK,大功告成,现在查不到数据的时候就会有提示了哦!
分类: Web design