PHP中实现冒泡排序和快速排序算法示例

 更新时间:2016年11月25日 17:22  点击:2277
冒泡排序和快速排序算法在开发应用中各有优点了,下面我们来看几个关于php排序的几个例子。

使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组。
使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组。
写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数

1. 使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组

 代码如下 复制代码

function bubble_sort($array)
{
$count = count($array);
if ($count <= 0) return false;
for($i=0; $i<$count; $i++){
for($j=$count-1; $j>$i; $j–){
if ($array[$j] < $array[$j-1]){
$tmp = $array[$j];
$array[$j] = $array[$j-1];
$array[$j-1] = $tmp;
}
}
}
return $array;
}


function quick_sort($array) {
if (count($array) <= 1) return $array;
$key = $array[0];
$left_arr = $right_arr = array();
foreach ($array as $val){
if ($val < = $key)
$left_arr[] = $val;
else
$right_arr[] = $val;
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}

2. 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组

 代码如下 复制代码
function bin_sch($array, $low, $high, $k){
if ($low <= $high){
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k){
return $mid;
}elseif ($k < $array[$mid]){
return bin_sch($array, $low, $mid-1, $k);
}else{
return bin_sch($array, $mid+1, $high, $k);
}
}
return -1;
}function seq_sch($array, $n, $k){
$array[$n] = $k;
for($i=0; $i<$n; $i++){
if($array[$i]==$k){
break;
}
}
if ($i<$n){
return $i;
}else{
return -1;
}
}

3. 写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数

 代码如下 复制代码

function array_sort($arr, $keys, $order=0) {
if (!is_array($arr)) {
return false;
}
$keysvalue = array();
foreach($arr as $key => $val) {
$keysvalue[$key] = $val[$keys];
}
if($order == 0){
asort($keysvalue);
}else {
arsort($keysvalue);
}
reset($keysvalue);
foreach($keysvalue as $key => $vals) {
$keysort[$key] = $key;
}
$new_array = array();
foreach($keysort as $key => $val) {
$new_array[$key] = $arr[$val];
}
return $new_array;
}

今天在个数据库类时一直都没法获取最后保存数据的ID了,经过反复排查还是没找到原因,不过后来总结了一些查找出mysql指定表中最后一条记录的ID或直接是说最新插入记录的ID,下面一起来看看。

开发什么的最喜欢了。写程序可以提高实力又可以收藏一些代码!的确很是不错。由于某些原因需要获取数据库最大的id值。所以出现了这段php 获取数据库最大的id代码了。这里面的max(id) 这里面的id 就是要获取最大的id了。如果是别的字段请填写为其他字段

方法一
 
$fh = mysql_query("select  MAX(id)  from log");
$c_echo = mysql_fetch_array($fh);
echo $c_echo;
 

方法二


<?php
//执行插入数据库的语句
//……
$getID=mysql_insert_id();//$getID即为最后一条记录的ID
 ?>

PHP 函数 mysql_insert_id() 是返回在最后一次执行了 INSERT 查询后,由 AUTO_INCREMENT 定义的字段的值。

方法三

msyql_query("select last_insert_id()");

last_insert_id() 是mysql 一个函数 也是 对当前链接起效
此用法 解决了 mysql_insert_id () 中遇到的 bigint 型问题

php输出控制只影响到echo输出不会影响到位cookie,session,header这些函数了,下面来看下本文章。

1、简介

当PHP脚本有输出时,输出控制函数可以用这些来控制输出。这在多种不同情况中非常有用,尤其是用来在脚本开始输出 数据后,发送http头信息到浏览器。输出控制函数不影响由 header()或setcookie()发送的文件头信息,仅影响像echo这样的函数和PHP代码块间的数据。

 2、作用

1)、如官方介绍说,为了避免在输出文件头信息如header()和setcookie()之前出现输出而发生的错误。可以使用输出缓存函数。如下代码

 代码如下 复制代码
<?php
    ob_start();      //打开缓存控制函数
    echo 'hello';
    header('Location: http://www.111cn.net/');
?>

2)、将输出内容放入缓存区,如需进行其他操作,如将输出写入缓存文件,可将缓冲区内容写入缓存文件,然后输出。

 代码如下 复制代码
 ob_start();
    echo 'hello';
    $file = ob_get_contents();
    ob_end_clean();
    write_cache($file);    //将缓冲区内容写入缓存函数,实现细节省略

3)、获取某些无返回值内置函数的输出内容,如phpinnfo();

 代码如下 复制代码
<?php
ob_start();
phpinfo();
$file = ob_get_contents();   //phpinfo()输出内容
ob_end_clean();
 
?>

4)、在使用框架的时候,我们会发现框架中会将输出缓冲然后进行变量替换。最后输出。

除了这些内容,我们还可以利用输出缓存进行错误处理,具体看代码。我们可以将错误信息获取,以更加友好的方式输出。

 代码如下 复制代码
<?php
 
function display_error()
{
 if($errors = error_get_last())
 {
  return var_export($errors , TRUE);
 }
 return FALSE;
}
 
$dis_error = 'display_error';
 
//$a = 3;
 
ob_start( $dis_error );
 
echo $a;

附:ob_start()官方解释:

bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )

此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。

内部缓冲区的内容可以用 ob_get_contents() 函数复制到一个字符串变量中。 想要输出存储在内部缓冲区中的内容,可以使用 ob_end_flush() 函数。另外, 使用 ob_end_clean() 函数会静默丢弃掉缓冲区的内容。

output_callback
可选参数 output_callback 函数可以被指定。 此函数把一个字符串当作参数并返回一个字符串。 当输出缓冲区被( ob_flush(), ob_clean() 或者相似的函数)冲刷(送出)或者被清洗的时候;或者在请求结束之际输出缓冲区内容被冲刷到浏览器的时候该函数将会被调用。 当调用 output_callback 时,它将收到输出缓冲区的内容作为参数 并预期返回一个新的输出缓冲区作为结果,这个新返回的输出缓冲区内容将被送到浏览器。 如果这个 output_callback 不是一个可以调用的函数,此函数 会返回 FALSE 。

如果回调函数有两个参数,第二个参数会由一个位域补充,该位域由 PHP_OUTPUT_HANDLER_START, PHP_OUTPUT_HANDLER_CONT 和 PHP_OUTPUT_HANDLER_END 组成。

如果 output_callback 返回 FALSE ,其原来的输入 内容被直接送到浏览器。

这个参数 output_callback 可以通过直接给一个 NULL 值而避开。

ob_end_clean(), ob_end_flush(), ob_clean(), ob_flush() and ob_start() 不能从一个回调函数中调用。 如果从回调函数中调用了它们,产生的行为是不明确的。 如果想要删除缓冲区的内容,从回调函数中返回一个”" (空字符串)。 更不能从一个回调函数中使用像print_r($expression, true) 或highlight_file($filename, true) 一样的输出缓冲函数。

下面给各位整理几个PHP读取大文件例子,本文章讲到的是测试文章在800M的数据哦,更大的文件小编没有测试过哦。

在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file、file_get_contents之类的函数,简简单单的几行代码就能很漂亮的完成我们所需要的功能。但当所操作的文件是一个比较大的文件时,这些函数可能就显的力不从心, 下面将从一个需求入手来说明对于读取大文件时,常用的操作方法。

需求

有一个800M的日志文件,大约有500多万行, 用PHP返回最后几行的内容。

实现方法

1. 直接采用file函数来操作

由于 file函数是一次性将所有内容读入内存,而PHP为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下限制只能最大使用内存16M,这是通过php.ini里的 memory_limit = 16M 来进行设置,这个值如果设置-1,则内存使用量不受限制。

下面是一段用file来取出这具文件最后一行的代码:

 代码如下 复制代码
<?php
ini_set('memory_limit', '-1');
$file = 'access.log';
$data = file($file);
$line = $data[count($data) - 1];
echo $line;
?>

整个代码执行完成耗时 116.9613 (s)。

我机器是2个G的内存,当按下F5运行时,系统直接变灰,差不多20分钟后才恢复过来,可见将这么大的文件全部直接读入内存,后果是多少严重,所以不在万 不得以,memory_limit这东西不能调得太高,否则只有打电话给机房,让reset机器了。

2.直接调用Linux的 tail 命令来显示最 后几行

在Linux命令行下,可以直接使用 tail -n 10 access.log 很轻易的显示日志文件最后几行,可以直接用PHP来调用tail命令,执行PHP代码如下:

 代码如下 复制代码
<?php
$file = 'access.log';
$file = escapeshellarg($file); // 对命令行参数进行安全转义
$line = `tail -n 1 $file`;
echo $line;
?>

整个代码执行完成耗时 0.0034 (s)

3. 直接使用PHP的 fseek 来进行文件操作

这种方式是最为普遍的方式,它不需要将文件的内容全部读入内容,而是直接通过指针来操作,所以效率是相当高效的。在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,下面是常用的两种方法:

方法一

首先通过fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取这一行的数据,再找次一行的起始位置, 再取这一行的位置,依次类推,直到找到了$num行。

#实现代码如下

 代码如下 复制代码
<?php
$fp = fopen($file, "r");
$line = 10;
$pos = -2;
$t = " ";
$data = "";
while ($line > 0)
{
 while ($t != "\n")
 {
  fseek($fp, $pos, SEEK_END);
  $t = fgetc($fp);
  $pos--;
 }
 $t = " ";
 $data .= fgets($fp);
 $line--;
}
fclose($fp);
echo $data
?>

整个代码执行完成耗时 0.0095 (s)

方法二

还是采用fseek的方式从文件最后开始读,但这时不是一位一位的读,而是一块一块的读,每读一块数据时,就将读取后的数据放在一个buf里,然后通过换 行符(\n)的个数来判断是否已经读完最后$num行数据。

#实现代码如下

 代码如下 复制代码
<?php
$fp = fopen($file, "r");
$num = 10;
$chunk = 4096;
$fs = sprintf("%u", filesize($file));
$max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);
for ($len = 0; $len < $max; $len += $chunk)
{
 $seekSize = ($max - $len > $chunk) ? $chunk : $max - $len;
 fseek($fp, ($len + $seekSize) * -1, SEEK_END);
 $readData = fread($fp, $seekSize) . $readData;
 if (substr_count($readData, "\n") >= $num + 1)
 {
  preg_match("!(.*?\n){" . ($num) . "}$!", $readData, $match);
  $data = $match[0];
  break;
 }
}
fclose($fp);
echo $data;
?>

整个代码执行完成耗时 0.0009(s)。

方法三

 代码如下 复制代码

<?php
function tail($fp, $n, $base = 5)
{
 assert($n > 0);
 $pos = $n + 1;
 $lines = array();
 while (count($lines) <= $n)
 {
  try
  {
   fseek($fp, -$pos, SEEK_END);
  }
  catch (Exception $e)
  {
   fseek(0);
   break;
  }
  $pos *= $base;
  while (!feof($fp))
  {
   array_unshift($lines, fgets($fp));
  }
 }

 return array_slice($lines, 0, $n);
}

var_dump(tail(fopen("access.log", "r+"), 10));
?>

整个代码执行完成耗时 0.0003(s)

php,curl函数组可以帮助我们把机器为装成人行为来抓取网站,下面来分享两个例子,一个是访问http网页,一个访问https网页,下面一起看看。

每次要使用curl的时候,总要查一堆资料。

现在将常用的几句保存下来,省的每次都去谷歌。

常规curl请求:

 

 代码如下 复制代码
$url = 'http://www.111cn.net';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
curl_close($curl);
var_dump($data);

使用curl请求HTTPS:

 

 代码如下 复制代码
$url = 'https://www.111cn.net';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//这个是重点。
$data = curl_exec($curl);
curl_close($curl);
var_dump($data);

注意

当请求https的数据时,会要求证书,这时候,加上下面这两个参数,规避ssl的证书检查

 代码如下 复制代码
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
[!--infotagslink--]

相关文章

  • C#几种排序算法

    作者:Sabine 【导读】本文介绍了C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序  冒泡排序 using System; namespace BubbleSorter { public class Bubb...2020-06-25
  • js实现数组冒泡排序、快速排序原理

    这篇文章主要为大家详细介绍了js实现数组冒泡排序、快速排序的原理,感兴趣的小伙伴们可以参考一下...2016-03-10
  • 图文详解Heap Sort堆排序算法及JavaScript的代码实现

    这篇文章以图文详解Heap Sort堆排序算法及JavaScript的代码实现,堆排序算法基于类二叉树的堆数据结构,需要的朋友可以参考下...2016-05-05
  • 分享javascript实现的冒泡排序代码并优化

    本文给大家汇总介绍了几个个人收藏的JavaScript实现冒泡排序的代码,都是非常的不错,有需要的小伙伴可以参考下...2016-06-12
  • C/C++实现八大排序算法汇总

    这篇文章主要为大家详细介绍了C/C++实现八大排序算法汇总,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • c# 冒泡排序算法(Bubble Sort) 附实例代码

    这篇文章主要介绍了c# 冒泡排序算法,需要的朋友可以参考下...2020-06-25
  • GOLANG版的冒泡排序和快速排序分享

    这篇文章主要介绍了GOLANG版的冒泡排序和快速排序分享,需要的朋友可以参考下...2020-05-11
  • C语言对数组元素进行冒泡排序的实现

    这篇文章主要介绍了C语言对数组元素进行冒泡排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-04
  • C#快速排序算法实例分析

    这篇文章主要介绍了C#快速排序算法,实例分析了C#排序方法的相关技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • C语言演示对归并排序算法的优化实现

    这篇文章主要介绍了C语言演示对归并排序算法的优化实现,归并排序的最差时间复杂度为(n\log n),最优时间复杂为(n),存在可以改进的空间,需要的朋友可以参考下...2020-04-25
  • PHP中实现冒泡排序和快速排序算法示例

    冒泡排序和快速排序算法在开发应用中各有优点了,下面我们来看几个关于php排序的几个例子。 使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组。 使用PHP描...2016-11-25
  • C++排序算法之插入排序

    这篇文章主要为大家详细介绍了C++排序算法之插入排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • c语言实现冒泡排序、希尔排序等多种算法示例

    c语言实现插入排序、冒泡排序、选择排序、快速排序、堆排序、归并排序、希尔排序示例,需要的朋友可以参考下...2020-04-25
  • php实现冒泡排序实例

    冒泡排序我们排序算法中的许多中的其中一样了,这里我们一起来了解一下php实现冒泡排序实现方法与原理,具体如下。 一个程序应包括: 对数据的描述:在程序中要指定数...2016-11-25
  • c++冒泡排序详解

    冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。...2020-04-25
  • C语言对磁盘文件进行快速排序简单实例

    这篇文章主要介绍了C语言对磁盘文件进行快速排序简单实例的相关资料,需要的朋友可以参考下...2020-04-25
  • php项目开发中用到的快速排序算法分析

    这篇文章主要介绍了php项目开发中用到的快速排序算法,结合实例形式详细分析了php快速排序的原理与使用方法,需要的朋友可以参考下...2016-07-02
  • stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)

    这篇文章主要介绍了stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列),需要的朋友可以参考下...2020-04-25
  • C#使用委托实现的快速排序算法实例

    这篇文章主要介绍了C#使用委托实现的快速排序算法,实例分析了C#委托机制与快速排序算法的实现技巧,需要的朋友可以参考下...2020-06-25
  • php 排序算法程序不用递归

    function quickSort(&$data, $beg, $end) 02 { 03 if ($end > $beg) { 04 $piv = $data[$beg]; 05 $k = $beg + 1; 06 $r = $end; 07 while ($k < $r) { 08 if...2016-11-25