PHP多维数组排序实现程序代码

 更新时间:2016年11月25日 16:47  点击:1714
在php中对数组排序包括一维数组排序与多维数组排序,下面我来详细介绍利用php数组排序函数与自定函数来实现数据排序的具体方法。

单数组排序

sort函数升序排序

bool sort ( array &$array [, int $sort_flags= SORT_REGULAR ] )

 代码如下 复制代码

<?php
$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);
var_dump($fruits);
?>

-rsort降序排列--

 

 代码如下 复制代码

<?php

$fruits = array("lemon", "orange", "banana", "apple");
rsort($fruits);var_dump($fruits);
?>

比如有个多维数组:

 

 代码如下 复制代码
 $arr = array(
    'd' => array('id' => 5, 'name' => 1, 'age' => 7),
    'b' => array('id' => 2,'name' => 3,'age' => 4),
    'a' => array('id' => 8,'name' => 10,'age' => 5),
    'c' => array('id' => 1,'name' => 2,'age' => 2)
);

需要对二维数组中的 age 项排序。


需要用到PHP的内置函数 array_multisort(),


array_multisort() 需要一个包含列的数组,因此用以下代码来取得列,然后排序。

 代码如下 复制代码
// 取得列的列表
foreach ($data as $key => $row) {
    $volume[$key]  = $row['volume'];
    $edition[$key] = $row['edition'];
}

// 将数据根据 volume 降序排列,根据 edition 升序排列
// 把 $data 作为最后一个参数,以通用键排序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

数据集合现在排好序了,结果如下:
volume | edition
-------+--------
    98 |       2
    86 |       1
    86 |       6
    85 |       6
    67 |       2
    67 |       7


 //自定义函数:
 

 代码如下 复制代码
function multi_array_sort($multi_array,$sort_key,$sort=SORT_ASC)
{
    if(is_array($multi_array))
    {
        foreach ($multi_array as $row_array)
        {
            if(is_array($row_array))
            {
                $key_array[] = $row_array[$sort_key];
            }
            else
            {
                return false;
            }
        }
    }
    else
    {
        return false;
    }
    array_multisort($key_array,$sort,$multi_array);
    return $multi_array;
}
 


//处理
 
 

 代码如下 复制代码
print_r(multi_array_sort($arr,'age'));
//输出
 Array
(
    [c] => Array
        (
            [id] => 1
            [name] => 2
            [age] => 2
        )
 
    [b] => Array
        (
            [id] => 2
            [name] => 3
            [age] => 4
        )
 
    [a] => Array
        (
            [id] => 8
            [name] => 10
            [age] => 5
        )
 
    [d] => Array
        (
            [id] => 5
            [name] => 1
            [age] => 7
        )
 
)

实际上真正在排序的时候还有很多方法可以使用,比如php的array数组自带的 arsort(),asort(),ksort(),krsort(),natsort(),natcasesort(),rsort(),usort(),array_multisort() 和 uksort()。

在我们开发过程中,判断数组为空时你会想到什么方法呢?首先想到的应该是empty函数,不过直接用empty函数判断为空是不对的,因为当这个值是多维数的时候,empty结果是有值的。

其实我们可以利用array_filter函数轻松去掉多维空值,而数组的下标没有改变,下面是举例用法:

array_filter() 函数用回调函数过滤数组中的元素,如果自定义过滤函数返回 true,则被操作的数组的当前值就会被包含在返回的结果数组中, 并将结果组成一个新的数组。如果原数组是一个关联数组,键名保持不变。

 代码如下 复制代码


<?php
$array = array(
 
0 => '霜天部落',
 
1 => false,
 
2 => 1,
 
3 => null,
 
4 => '',
 
5 => 'http://www.111cn.net',
 
6 => '0'
 
);
 
print_r(array_filter($array));
 
?>

上面代码输出结果为:

Array
(
[0] => 霜天部落
[2] => 1
[5] => http://www.111cn.net
)

这样就把为空或者null或者false的值排除掉

上面我们再进行优化

 

 代码如下 复制代码
function delEmpty($v)   
{  
if ($v==="" || $v==="php")   //当数组中存在空值和php值时,换回false,也就是去掉该数组中的空值和php值
    {  
    return false;  
    }  
return true;  
}  
$a=array(0=>"pig",1=>"Cat",2=>"",3=>"php");  
print_r(array_filter($a,"delEmpty")); 
这两个函数都是执行Linux命令函数,不同的是获取返回结果不一样,exec只能获取最后一行数据,shell_execu则可以获取全部数据。

假如脚本路径下有如下文件

-bash-4.1# ll
总用量 12
-rw-rw-r--. 1 www web 133  7月 16 15:00 a.php
-rw-r--r--. 1 lee web  59  2月 29 17:05 b.php
-rw-r--r--. 1 lee web  81  3月  8 17:00 c.php

先看一下php手册对这二个函数的解释:

exec --- 执行外部程式

  语法 : string exec ( string command [, array &output [, int &return_var]] )

  说明 :

  exec( )执行给予的命令command,不过它并不会输出任何东西,它简单的从命令的结果中传回最后一行,如果你需要去执行一个命令,并且从命令去取得所有资料时,可以使用passthru( )这个函数。

  如果有给予参数array,则指定的数组将会被命令所输出的每一行填满,注意 : 如果数组先前已经包含了一些元素的话,exec( )将会把它附加在数组的后面,如果你不想要此函数附加元素的话,你可以在传递此数组给exec( )之前呼叫unset( )。


exec例子

 代码如下 复制代码

<?php
/**
 * exec与shell_exec的区别
 * 琼台博客
 */
$data = exec('/bin/ls -l');
echo '<pre>';
print_r($data);
echo '</pre>';
?>

执行结果

 
-rw-r--r--. 1 lee web  81 Mar  8 17:00 c.phpshell_exec例子

shell_exec()

  shell_exec() 命令行实际上仅是反撇号 (`) 操作符的变体。如果您编写过 shell 或 Perl 脚本,您就知道可以在反撇号操作符内部捕捉其他命令的输出。例如,清单 1 显示了如何使用反撇号在当前目录中获取每个文本(.txt)的单词计数。


在 shell_exec()
中运行相同的命令

 代码如下 复制代码


<?php


$results
=
shell_exec
(
'
wc -w *.txt
'
)
;

echo

$results
;

?>

在图 1 中可以看到,获得的结果与从 shell 脚本得到的一样

exec与shell_exec的区别

 

 代码如下 复制代码
<?php
/**
 * 
 * 琼台博客
 */
$data = shell_exec('/bin/ls -l');
echo '<pre>';
print_r($data);
echo '</pre>';
?>

执行结果

 total 12
-rw-rw-r--. 1 www web 139 Jul 16  2012 a.php
-rw-r--r--. 1 lee web  59 Feb 29 17:05 b.php
-rw-r--r--. 1 lee web  81 Mar  8 17:00 c.php所以平时使用exec函数的童鞋注意了,如果你需要获取全部返回信息,就应该使用shell_exec函数,当然,如果命令执行结果只有一行返回信息,那么使用哪个都无所谓

 代码如下 复制代码

/**
 * 获取系统信息
 *
 * @return array
 */
function getSystemInfo()
{
 $systemInfo = array();
 
 // 系统
 $systemInfo['os'] = PHP_OS;
 
 // PHP版本
 $systemInfo['phpversion'] = PHP_VERSION;
 
 // Apache版本
 $systemInfo['apacheversion'] = apache_get_version();
 
 // ZEND版本
 $systemInfo['zendversion'] = zend_version();
 
 // GD相关
 if (function_exists('gd_info'))
 {
  $gdInfo = gd_info();
  $systemInfo['gdsupport'] = true;
  $systemInfo['gdversion'] = $gdInfo['GD Version'];
 }
 else
 {
  $systemInfo['gdsupport'] = false;
  $systemInfo['gdversion'] = '';
 }
 
 // 安全模式
 $systemInfo['safemode'] = ini_get('safe_mode');
 
 // 注册全局变量
 $systemInfo['registerglobals'] = ini_get('register_globals');
 
 // 开启魔术引用
 $systemInfo['magicquotes'] = (function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc());
 
 // 最大上传文件大小
 $systemInfo['maxuploadfile'] = ini_get('upload_max_filesize');
 
 // 脚本运行占用最大内存
 $systemInfo['memorylimit'] = get_cfg_var("memory_limit") ? get_cfg_var("memory_limit") : '-';
 
 return $systemInfo;
}

 


 

在php计算字符串相似度similar_text与相似度levenshtein函数的详细介绍,下面我们详细的介绍一下关于字符串相似度介绍。

similar_text — 计算两个字符串的相似度
int similar_text ( string $first , string $second [, float &$percent ] )
$first 必需。规定要比较的第一个字符串。
$second 必需。规定要比较的第二个字符串。
$percent 可选。规定供存储百分比相似度的变量名。

两个字符串的相似程度计算依据 Oliver [1993] 的描述进行。注意该实现没有使用 Oliver 虚拟码中的堆栈,但是却进行了递归调用,这个做法可能会导致整个过程变慢或变快。也请注意,该算法的复杂度是 O(N**3),N 是最长字符串的长度。

比如我们想找字符串abcdefg和字符串aeg的相似度:

 代码如下 复制代码

$first = "abcdefg";
$second = "aeg";
 
echo similar_text($first, $second);结果输出3.如果想以百分比显示,则可使用它的第三个参数,如下:

$first = "abcdefg";
$second = "aeg";
 
similar_text($first, $second, $percent);
echo $percent;

similar_text函数的使用及实现过程。similar_text() 函数主要是用来计算两个字符串的匹配字符的数目,也可以计算两个字符串的相似度(以百分比计)。与 similar_text() 函数相比,我们今天要介绍的 levenshtein() 函数更快。不过,similar_text() 函数能通过更少的必需修改次数提供更精确的结果。在追求速度而少精确度,并且字符串长度有限时可以考虑使用 levenshtein() 函数。

使用说明
先看手册上 levenshtein() 函数的说明:

levenshtein() 函数返回两个字符串之间的 Levenshtein 距离。

Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如把 kitten 转换为 sitting:

sitten (k→s)
sittin (e→i)
sitting (→g)levenshtein() 函数给每个操作(替换、插入和删除)相同的权重。不过,您可以通过设置可选的 insert、replace、delete 参数,来定义每个操作的代价。

语法:

levenshtein(string1,string2,insert,replace,delete)

参数 描述

•string1 必需。要对比的第一个字符串。
•string2 必需。要对比的第二个字符串。
•insert 可选。插入一个字符的代价。默认是 1。
•replace 可选。替换一个字符的代价。默认是 1。
•delete 可选。删除一个字符的代价。默认是 1。
提示和注释

•如果其中一个字符串超过 255 个字符,levenshtein() 函数返回 -1。
•levenshtein() 函数对大小写不敏感。
•levenshtein() 函数比 similar_text() 函数更快。不过,similar_text() 函数提供需要更少修改的更精确的结果。
例子

 代码如下 复制代码

<?php
    echo levenshtein("Hello World","ello World");
    echo "<br />";
    echo levenshtein("Hello World","ello World",10,20,30);
?>

输出: 1 30

[!--infotagslink--]

相关文章

  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 微信小程序 页面传值详解

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • php curl模拟post请求和提交多维数组的示例代码

    下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <&#63;php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
  • C#使用Process类调用外部exe程序

    本文通过两个示例讲解了一下Process类调用外部应用程序的基本用法,并简单讲解了StartInfo属性,有需要的朋友可以参考一下。...2020-06-25
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 微信小程序二维码生成工具 weapp-qrcode详解

    这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23
  • uniapp微信小程序:key失效的解决方法

    这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
  • 将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文

    时常会写用c#一些程序,但如何将他们和photoshop一样的大型软件打成一个压缩包,以便于发布....2020-06-25
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
  • 微信小程序 网络请求(GET请求)详解

    这篇文章主要介绍了微信小程序 网络请求(GET请求)详解的相关资料,需要的朋友可以参考下...2016-11-22
  • 微信小程序自定义tabbar组件

    这篇文章主要为大家详细介绍了微信小程序自定义tabbar组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-14
  • 微信小程序如何获取图片宽度与高度

    这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
  • 微信小程序实现点击导航条切换页面

    这篇文章主要为大家详细介绍了微信小程序实现点击导航条切换页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-19
  • 微信小程序手势操作之单触摸点与多触摸点

    这篇文章主要介绍了微信小程序手势操作之单触摸点与多触摸点的相关资料,需要的朋友可以参考下...2017-03-13
  • 微信小程序(应用号)开发新闻客户端实例

    这篇文章主要介绍了微信小程序(应用号)开发新闻客户端实例的相关资料,需要的朋友可以参考下...2016-10-25
  • 微信小程序实现canvas分享朋友圈海报

    这篇文章主要为大家详细介绍了微信小程序实现canvas分享朋友圈海报,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-21
  • Python爬取微信小程序通用方法代码实例详解

    这篇文章主要介绍了Python爬取微信小程序通用方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-29
  • 微信小程序 页面跳转传递值几种方法详解

    这篇文章主要介绍了微信小程序 页面跳转传递值几种方法详解的相关资料,需要的朋友可以参考下...2017-01-16
  • 微信小程序自定义底部弹出框动画

    这篇文章主要介绍了微信小程序自定义底部弹出框动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-16