首页 > 编程技术 > php

php 计算两数组交集两个函数

发布时间:2016-11-25 16:48

,使用 array_intersect 求两个数组的交集比使用 array_diff 求同样两个数组的并集要快。

如果要求数组 $a 与数组 $b 的差集的个数,应该使用  count($a) - count(array_intersect($a, $b)),而不要用 count(array_diff($a, $b));


前面要比后者快,在大数组中更为明显。

array_intersect() 函数返回两个或多个数组的交集数组。

结果数组包含了所有在被比较数组中,也同时出现在所有其他参数数组中的值,键名保留不变。

注释:仅有值用于比较。

语法
array_intersect(array1,array2,array3...)参数 描述
array1 必需。与其他数组进行比较的第一个数组。
array2 必需。与第一个数组进行比较的数组。
array3 可选。与第一个数组进行比较的数组。可以有多个。
例子

<?php教程
$a1=array(0=>"Cat",1=>"Dog",2=>"Horse");
$a2=array(3=>"Horse",4=>"Dog",5=>"Fish");
print_r(array_intersect($a1,$a2));
?>输出:

Array ( [1] => Dog [2] => Horse )


array_diff() 函数返回两个数组的差集数组。该数组包括了所有在被比较的数组中,但是不在任何其他参数数组中的键值。

在返回的数组中,键名保持不变。

语法
array_diff(array1,array2,array3...)参数 描述
array1 必需。与其他数组进行比较的第一个数组。
array2 必需。与第一个数组进行比较的数组。
array3 可选。与第一个数组进行比较的数组。
提示和注释
提示:可用一个或任意多个数组与第一个数组进行比较。

注释:仅有值用于比较。

例子
<?php
$a1=array(0=>"Cat",1=>"Dog",2=>"Horse");
$a2=array(3=>"Horse",4=>"Dog",5=>"Fish");
print_r(array_diff($a1,$a2));
?>输出:

Array ( [0] => Cat )

php教程 array_multisort()函数详解

函数 bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $...]]] )

参数说明: 函数对多个数组或多维数组进行排序

第一个参数是数组,随后的每一个参数可能是数组,也可能是下面的排序顺序标志

SORT_ASC - 默认,按升序排列

SORT_DESC - 按降序排列

随后可以指定排序的类型

SORT_REGULAR - 默认。将每一项按常规顺序排列。

SORT_NUMERIC - 将每一项按数字顺序排列。

SORT_STRING - 将每一项按字母顺序排列。

实例代码

$arr1 = array('10', 11, 100, 100, 'a');

$arr2 = array(1, 2, 3, '2', 5);

array_multisort($arr1, $arr2);

结果为:

$arr1
Array ( [0] => 10 [1] => a [2] => 11 [3] => 100 [4] => 100 )
# '10'在与11, 100, 100比较时转换为整数10,小于其他三个数
# '10'在于'a'比较时作为字符串,其第一个字符'1'ascii码值为49小于‘a'(ascii值为97),所以‘10’为最小元素
# 'a'在于其他三个数字比较时,转换为整数0,小于其他三个数

$arr2
Array ( [0] => 1 [1] => 5 [2] => 2 [3] => 2 [4] => 3 )
# $arr2元素1与$arr1元素'10'位置对应,所以排在[0]位置
# $arr1[2] => 100, $arr1[3] => 100分别对应$arr2元素3, '2'。3大于'2',所以与2对应的$arr1[2] => 100排序后的下标为

3,与3对应的$arr1[3] => 100排序的下标为4

总结

1.参与排序的数组元素数保持一致
2.排序数组元素位置对应如, ‘10’ => 1 , 11 => 2
3.后边的数组在前边数组的顺序的基础上进行排序
4.前边的数组如遇相等的元素则比较后边的数组

语法

array_multisort(array1,sorting order,sorting type,array2,array3...)
参数 描述
array1 必需。规定输入的数组。
sorting order 可选。规定排列顺序。可能的值是 SORT_ASC 和 SORT_DESC。
sorting type 可选。规定排序类型。可能的值是SORT_REGULAR、SORT_NUMERIC和SORT_STRING。
array2 可选。规定输入的数组。
array3 可选。规定输入的数组。

提示和注释

注释:字符串键名将被保留,但是数字键将被重新索引,从 0 开始,并以 1 递增。

注释:您可以在每个数组后设置排序顺序和排序类型。如果没有设置,每个数组参数会使用默认

 

php教程 魔术函数集中营

  1。__construct()

  实例化对象时被调用,

  当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。

  2。__destruct()

  当删除一个对象或对象操作终止时被调用。

  3。__call()

  对象调用某个方法,

  若方法存在,则直接调用;

  若不存在,则会去调用__call函数。

  4。__get()

  读取一个对象的属性时,

  若属性存在,则直接返回属性值;

  若不存在,则会调用__get函数。

  5。__set()

  设置一个对象的属性时,

  若属性存在,则直接赋值;

  若不存在,则会调用__set函数。

  6。__toString()

  打印一个对象的时被调用。如echo $obj;或print $obj;

  7。__clone()

  克隆对象时被调用。如:$t=new Test();$t1=clone $t;

  8。__sleep()

  serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。

  9。__wakeup()

  unserialize时被调用,做些对象的初始化工作。

  10。__isset()

  检测一个对象的属性是否存在时被调用。如:isset($c->name)。

  11。__unset()

  unset一个对象的属性时被调用。如:unset($c->name)。

  12。__set_state()

  调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。

  13。__autoload()

  实例化一个对象时,如果对应的类不存在,则该方法被调用。

  魔术常量

  1。__LINE__

  返回文件中的当前行号。

  2。__FILE__

  返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。

  3。__FUNCTION__

  返回函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

  4。__CLASS__

  返回类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

  5。__METHOD__

  返回类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

关于session_unset()和session_destroy()的函数使用进行介绍。

session_unset()
释放当前在内存中已经创建的所有$_SESSION变量,但不删除session文件以及不释放对应的session
id

session_destroy()
删除当前用户对应的session文件以及释放session
id,内存中的$_SESSION变量内容依然保留

if (session_destroy())
        {
            ShowMsg("注销成功!",'/member/login');
            exit();
        }
        else
        {
            unset($_SESSION);
            ShowMsg("注销成功!",'/member/login');
            exit();
        }


因此,释放用户的session所有资源,需要顺序执行如下代码:
程序代码

<?php教程
$_SESSION['user'] =
'lowell';
session_unset();
session_destroy();
?>

另一个网友分析

session_unregister是注销一个session变量;
session_destroy是注销所有的session变量,并且结束session会话;
session_unset()并不注销session变量,但把所有的session变量的值清空.

那么一般在做退出的操作时可以这样做:

session_start();
session_unset();
session_destroy();
header("location:XXX.php");

在php中销毁变量有很多不同的方法。如:unset();session_unset();session_destroy();但session变量作为特殊的变量,不同的销毁方式更会产生不同的结果。

unset()在php3时其使用后会返回一个boolean值,但在php4及以后的版本,其只是一个没有返回值的语句。如果在函数中unset()的一个全局变量或者一个通过引用传递的值,则其只能在局部销毁变量,在调用环境中的变量却会保持调用unset()前一样的值。如果unset一个静态变量,则静态变量及其所有引用都会被销毁。如果想unset一个globals变量则可以借用GLOBALS数组来销毁:unset($GLOBALS['str']);

unset($_SESSION['str'])则可以删除单个的$_SESSION['str']变量。若使用unset($_SESSION);则删除服务器上的所有SESSION文件

session_unset()删除当前所有的session值,其结果同session_destroy();

在php教程中数组是种强大的数据类型,他可以做的事情很多,可以存储不同的数据类型在一个数组中,下面我们列出了数组常用的操作,排序,键名对数组排序等做法。

<?php
/* 数组的常用函数
 *
 * 数组的排序函数
 *   sort()
 *   rsort()
 *   usort()
 *   asort()
 *   arsort()
 *   uasort()
 *   ksort()
 *   krsort()
 *   uksort()
 *   uatsort()
 *   natcasesort()
 *   array_multisort()
 *
 *    1.简单的数组排序
 *      sort() rsort()
 *    2.根据键名对数组排序
 *      ksort() krsort()
 *    3.根据元素的值对数组排序
 *      asort() arsort()
 *    4.根据"自然数排序“法对数组排序
 *      natsort()//区分大小写字母比较 natcasescort()//不区分大小写字母的比较
 *    5.根据用户自定义规则对数组排序
 *      usort() uasort() uksort()对键排序
 *    6.对维数组的排序
 *      array_multisort()
 *
 * 拆分、合并、分解、接合的数组函数
 *    1.array_slice()
 *    2.array_splice()//删除
 *    3.array_combine()//合并
 *    4.array_merge();//合并
 *    5.array_intersect();//多个数组的交集
 *    6.array_diff();//返回多个数组的差集
 *
 * 数组与数据结构的函数
 *   1.使用数组实现堆栈 //先进后出
 *    array_push() array_pop()
 *   2.使用数组实现队列 //先进先出
 *    array_unshift() array_shift() unset()
 *
 * 
 * 其他与数组操作有关的函数
 *    array_rand()
 *    shuffle()
 *    array_sum()
 *    range()
 */

//简单数组排序的使用
$data=array(5,8,1,7,2);
sort($data);//元素由小到大进行排序
print_r($data);//Array ( [0] => 1 [1] => 2 [2] => 5 [3] => 7 [4] => 8 )
rsort($data);//元素由大到小进行排序
print_r($data);//Array ( [0] => 8 [1] => 7 [2] => 5 [3] => 2 [4] => 1 )

//根据键名排序的例子
$data_2=array(5=>"five",8=>"eight",1=>"one",7=>"seven",2=>"two");
ksort($data_2);//对数组的下标进行由小到大排序
print_r($data_2);//Array ( [1] => one [2] => two [5] => five [7] => seven [8] => eight )
krsort($data_2);//对数组的下标进行由大到小排序
print_r($data_2);//Array ( [8] => eight [7] => seven [5] => five [2] => two [1] => one )

 

//根据元素的值对数组排序
$data_3=array("1"=>"Linux","a"=>"Apache","m"=>"MySQL","l"=>"PHP");
//asort() arsort  与 sort() rsort()的区别在于 前者排序后保持原有的键名,后者不保持原有键名,且键名从0开始
asort($data_3);
print_r($data_3);//Array ( [a] => Apache [1] => Linux [m] => MySQL [l] => PHP )
echo '<br/>';
arsort($data_3);
print_r($data_3);//Array ( [l] => PHP [m] => MySQL [1] => Linux [a] => Apache )
echo '<br/>';
sort($data_3);
print_r($data_3);//Array ( [0] => Apache [1] => Linux [2] => MySQL [3] => PHP )
echo '<br/>';
rsort($data_3);
print_r($data_3);//Array ( [0] => PHP [1] => MySQL [2] => Linux [3] => Apache )

//根据”自然数排序法“对数组排序(0-9短者优先)
$data_4=array("file.txt","file11.txt","file2.txt","file22.txt");
sort($data_4);
print_r($data_4);//Array ( [0] => file.txt [1] => file11.txt [2] => file2.txt [3] => file22.txt )
echo '<br>';
natsort($data_4);
print_r($data_4);//Array ( [0] => file.txt [2] => file2.txt [1] => file11.txt [3] => file22.txt )
echo '<br>';
natcasesort($data_4);
print_r($data_4);//Array ( [0] => file.txt [2] => file2.txt [1] => file11.txt [3] => file22.txt )
echo '<br>';

//用户自定义排序函数
echo '<br/>';
$data_5=array("Linux","Apache","MySQL","PHP");
usort($data_5,"sortbylen");//通过元素长度排序
print_r($data_5);//Array ( [0] => PHP [1] => MySQL [2] => Linux [3] => Apache )
function sortbylen($one,$two){
 if(strlen($one)==strlen($two))
  return 0;
 else
  return (strlen($one)>strlen($two))?1:-1;
}

//拆分、合并、分解、接合的数组函数
echo '<br/>';
$data_6=array("Linux","Apache","MySQL","PHP");
print_r(array_slice($data_6,1,2));//取下标为1、2的元素
//Array ( [0] => Apache [1] => MySQL ) 下标重置从0开始
echo '<br/>';

print_r(array_slice($data_6,-2,1));//从后边的第二个开始取返回一个,不是从0开始的
//Array ( [0] => MySQL ) 下标重置从0开始
echo '<br/>';

print_r(array_slice($data_6,1,2,true));
//Array ( [1] => Apache [2] => MySQL )  保留原有的下标

echo '<br/>';


//array_combine()
$a1=array("OS","WebServer","DataBase","Language");
$a2=array("Linux","Apache","MySQL","PHP");

print_r(array_combine($a1,$a2));//第一个参数作为键名,第二个作为值来合并
//Array ( [OS] => Linux [WebServer] => Apache [DataBase] => MySQL [Language] => PHP )

echo '<br/>';

//array_merge()
$a3=array("OS","WebServer","DataBase","Language");
$a4=array("Linux","Apache","MySQL","PHP");
$a5=$a3+$a4;
print_r($a5);//因为两个数组下标重复所以显示这样
//Array ( [0] => OS [1] => WebServer [2] => DataBase [3] => Language )
echo '<br/>';
print_r(array_merge($a3,$a4));//合并并重新索引
//Array ( [0] => OS [1] => WebServer [2] => DataBase [3] => Language [4] => Linux [5] => Apache [6] => MySQL [7] => PHP )

echo '<br/>';

//array_intersect()
$a7=array("OS","WebServer","DataBase","Language",1,2,3);
$a8=array("Linux","Apache","MySQL","PHP",2,3,4);
print_r(array_intersect($a7,$a8));//Array ( [5] => 2 [6] => 3 )
echo '<br/>';

//array_diff()
$a9=array(1,2,3,4);
$a10=array(3,4,5,6);
print_r(array_diff($a9,$a10));//Array ( [0] => 1 [1] => 2 )
//返回第一个数组跟第二个相差的元素
echo '<br/>';


//使用数组实现堆栈
$b=array(1,2,3,4);
$b[]="a";//入栈
array_push($b,"b","c");//使用函数入栈
print_r($b);//Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => a [5] => b [6] => c )
echo '<br/>';

$value=array_pop($b);//使用函数出栈
print_r($b);//Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => a [5] => b )
echo '<br/>';
echo $value;//显示出栈的元素的值 c
echo '<br/>';

//使用数组实现队列
$c=array(1,2,3);
print_r($c);//Array ( [0] => 1 [1] => 2 [2] => 3 )
echo '<br/>';
array_unshift($c,"abc","bcd");//入队
print_r($c);//Array ( [0] => abc [1] => bcd [2] => 1 [3] => 2 [4] => 3 )
echo '<br/>';
$values=array_shift($c);//出队
print_r($c);// Array ( [0] => bcd [1] => 1 [2] => 2 [3] => 3 )
echo '<br/>';
unset($c[2]);//删除指定位置元素
print_r($c);//Array ( [0] => bcd [1] => 1 [3] => 3 )
echo '<br/>';


//array_rand()  随机返回数组下标
$arr=array(1,3,4,5,76,7,99,6,2,3);
echo array_rand($arr);//返回的是随机的数组元素的下标
echo $arr[array_rand($arr)];//随机显示数组元素的值
echo '<br/>';
//shuffle()  随机重新排列数组
$arr2=array(32,35,33);
shuffle($arr2);
print_r($arr2);//数组元素位置随机变换
echo '<br/>';
//array_sum()  求和
$arr3=array(1,3,5);
echo array_sum($arr3); //返回9
echo '<br/>';
print_r($arr3);//Array ( [0] => 1 [1] => 3 [2] => 5 )
echo '<br/>';
//range(最小值,最大值,步长)
$arr4=range(0,100,10);
print_r($arr4);//Array ( [0] => 0 [1] => 10 [2] => 20 [3] => 30 [4] => 40 [5] => 50 [6] => 60 [7] => 70 [8] => 80 [9] => 90 [10] => 100 )

?>

标签:[!--infotagslink--]

您可能感兴趣的文章: