【web开发】PHP之字符串比较

举报
迷彩 发表于 2023/07/29 00:11:35 2023/07/29
【摘要】 前言字符串的比较或者说字符串的判断是任何一门编程语言的字符串处理功能中的非常重要的特性之一。同时也是在实际开发中最常使用的字符串判断方式,在PHP中,除了可以使用比较运算符号(“==”或者<以及>)来进行比较操作,还提供了一个系列的比较函数,使得PHP可以进行更加复杂的字符串比较,也使得PHP中的字符串比较更加强大和简便。如:strcmp(),strcasecmp()以及strnatcmp(...

前言

字符串的比较或者说字符串的判断是任何一门编程语言的字符串处理功能中的非常重要的特性之一。同时也是在实际开发中最常使用的字符串判断方式,在PHP中,除了可以使用比较运算符号(“==”或者<以及>)来进行比较操作,还提供了一个系列的比较函数,使得PHP可以进行更加复杂的字符串比较,也使得PHP中的字符串比较更加强大和简便。如:strcmp(),strcasecmp()以及strnatcmp()等等函数,不知道你有没有发现在PHP中,有关于字符的比较操作函数几乎是以str开头的函数,当然也有个别的函数并不是这样,如:substr_compare()【从指定的开始位置(二进制安全和选择性区分大小写)比较两个字符串。】,只是大部分常用的函数是这样的。就连很多其他字符串相关的操作函数也是str开头的。在平时的学习中学会归纳总结,更有利于记忆.如下图:

按字节顺序进行字符串比较

要按字节顺序进行字符串的比较,可以使用strcmp()和strcasecmp()两个函数(cmp就是compare),其中函数strcasecmp()函数可以忽略字符串中字母的大小写进行比较。

int strcmp(string str1, string str2) //区分字母大小写
int strcasecmp(string str1, string str2) //不区分字母大小写

这两个函数的用法是类似的几乎一模一样,最大的区别就是字母的大小写比较,两个函数都需要传入进行比较的两个字符串参数。可以对输入的str1和str2两个字符串,按照字节的ASCII值从两个字符串的首字节开始比较,如果相等则进入下一个字节的比较,直至结束比较。返回以下三个值其中之一:

  1. 如果str1等于str2则返回0
  2. 如果str1大于str2则返回1
  3. 如果str1小于str2则返回-1

我们通过例子来详细介绍,先看例子:

<?php
$name = "zhangsan";
$password = "123456qwert";

if(strcasecmp($name, "zhangsan") == 0){ //使用不区分字母大小写的比较函数进行比较
	echo "用户已存在<br>";
}

if(strcasecmp(strtolower($name),strtolower("zhangsan")) == 0){//当存在字符大小写的时候,可以使用字母转换函数同时转换为大写或者小写再进行比价,同样起到忽略大小写进行比较的效果
	echo "用户已存在<br>";
}

$flag = strcmp($password, "123456qwert");
if($flag == 0){
	echo "两个字符相等<br>";
}elseif($flag == 1){
	echo "第一个字符串大于第二个字符串<br>";
}elseif($flag == -1){
	echo "第一个字符串小于第二个字符串<br>";
}

switch($flag){
	case 0:
		echo "两个字符相等<br>";
		break;
	case 1:
		echo "第一个字符串大于第二个字符串<br>";
		break;
	case -1:
		echo "第一个字符串小于第二个字符串<br>";
		break;
}

执行结果如下:

以上的例子中,通过字符串比较后对返回值判断两个比较字符串的大小。使用strcmp()函数进行区分字符串中的字母大小写的比较。使用strcasecmp()函数进行忽略字符串中字母大小写的比较。当然也可以对中文等多字节字符进行比较。

按自然排序进行字符串比较

除了可以按照字节位的字典顺序进行比较,PHP中还提供了按照自然排序法对字符串进行比较。所谓的自然顺序是指按照人们日常生活中的思维习惯进行排序,即是将字符串中的数字部分按照数字大小进行比较。比如:按照字节比较时:"4"大于"22",因为"4"大于"22"中的第一个字符,而按照自然顺序法则应是"22"大于"4"的.使用strnatcmp()函数(nat在这里是nature的意思)按自然排序法比较两个字符串,此函数对大小写敏感,其使用格式与strcmp()函数类似,也就是使用的过程中是区分字母大小写的.下面我们通过具体的例子进行了解:

对一个数组中带有数字的文件名,使用冒泡排序法(在编程中还有很多经典的排序算法,感兴趣的话可以自行了解,前面的文章中也有常用算法的介绍)分别通过两种比较方法进行排序:

<?php
$filesArr = array(
	"file11.txt",
	"file22.txt",
	"file1.txt",
	"file2.txt",
	"file4.txt",
	"file33.txt"
);

//定义一个冒泡排序算法
function bubbleSort($arr, $sel=false){
	for($i=0; $i<count($arr); $i++){
		for($j=0; $j<(count($arr)-1); $j++){
			if($sel){
				if(strcmp($arr[$j], $arr[$j+1]) > 0){
					//交换值
					$temp = $arr[$j];
					$arr[$j] = $arr[$j+1];
					$arr[$j+1] = $temp;
				}
			}else{
				if(strnatcmp($arr[$j], $arr[$j+1]) > 0){
					//交换值
					$temp = $arr[$j];
					$arr[$j] = $arr[$j+1];
					$arr[$j+1] = $temp;
				}
			}
		}
	}
	return $arr;
}
//使用strcmp
echo "使用strcmp():";
echo "<pre>";
print_r(bubbleSort($filesArr, true));
//使用strnatcmp
echo "<br>";
echo "使用strnatcmp():";
echo "<pre>";
print_r(bubbleSort($filesArr, false));

执行结果如下:

从结果就可以明显看出区别,在PHP中也提供了这个函数的忽略大小写的函数strnatcasecmp(),使用方法和strnatcmp()函数相同.

<?php
$filesArr = array(
	"file11.txt",
	"file22.txt",
	"file1.txt",
	"File2.txt",
	"file4.txt",
	"file33.txt"
);

//定义一个冒泡排序算法
function bubbleSort($arr, $sel=false){
	for($i=0; $i<count($arr); $i++){
		for($j=0; $j<(count($arr)-1); $j++){
			if($sel){
				if(strcmp($arr[$j], $arr[$j+1]) > 0){
					//交换值
					$temp = $arr[$j];
					$arr[$j] = $arr[$j+1];
					$arr[$j+1] = $temp;
				}
			}else{
				if(strnatcmp($arr[$j], $arr[$j+1]) > 0){
					//交换值
					$temp = $arr[$j];
					$arr[$j] = $arr[$j+1];
					$arr[$j+1] = $temp;
				}
			}
		}
	}
	return $arr;
}

//定义一个冒泡排序算法 ,忽略大小写
function bubbleSort2($arr, $sel=false){
	for($i=0; $i<count($arr); $i++){
		for($j=0; $j<(count($arr)-1); $j++){
			if($sel){
				if(strcasecmp($arr[$j], $arr[$j+1]) > 0){
					//交换值
					$temp = $arr[$j];
					$arr[$j] = $arr[$j+1];
					$arr[$j+1] = $temp;
				}
			}else{
				if(strnatcasecmp($arr[$j], $arr[$j+1]) > 0){
					//交换值
					$temp = $arr[$j];
					$arr[$j] = $arr[$j+1];
					$arr[$j+1] = $temp;
				}
			}
		}
	}
	return $arr;
}
echo "区分大小写<br>";
//使用strcmp
echo "使用strcmp():";
echo "<pre>";
print_r(bubbleSort($filesArr, true));
//使用strnatcmp
echo "<br>";
echo "使用strnatcmp():";
echo "<pre>";
print_r(bubbleSort($filesArr, false));

echo "忽略大小写<br>";
//使用strcmp
echo "使用strcmp():";
echo "<pre>";
print_r(bubbleSort2($filesArr, true));
//使用strnatcmp
echo "<br>";
echo "使用strnatcasecmp():";
echo "<pre>";
print_r(bubbleSort2($filesArr, false));

执行结果如下:通过输出的结果对比一目了然

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。