分类 PHP 下的文章

一些简单的排序法(已烂大街)

冒泡排序,快速排序,选择排序,二分法查找,快速查找

/**

  • 冒泡排序
  • 相邻2数比较,小的在前,大的在后
  • 数组有几个元素,就要比较几轮 $i
  • 每轮需要比较的次数为,数组元素个数-已比较的次数 $j
  • @param array $array 要操作的数组
  • @return array $array 返回的数组
    */

function bubbleSort($array)
{

    $cnt = count($array);
    for($i = 0; $i < $cnt ; $i++){
            for($j = 0 ; $j < ($cnt-$i-1) ; $j++){
                    if($array[$j] > $array[$j+1]){
                            $temp = $array[$j];
                            $array[$j] = $array[$j+1];
                            $array[$j+1] = $temp;
                    }
            }
    }
    return $array;

}

/**

  • 快速排序
  • 递归实现
  • 获取数组第一个数,循环使后面的数与其比较,
  • 比其小的放在一个数组中,比其大的放在一个数组中
  • 将2个数组递归调用,直到最终数组元素小于等于1时,没有可以比较的元素
  • 通过array_merge函数,将比较的数组按大小顺序合并然后一层一层的return出去,最终实现从小到大排序
  • @param array $array 要操作的数组
  • @return array $array 返回的数组
    */

function quickSort($array)
{

    if(count($array) <= 1 ) return $array;
    $key = $array[0];
    $left_arr = array();
    $right_arr = array();
    for ($i=1;$i<count($array);$i++){
            if($array[$i] <= $key){
                    $left_arr[] = $array[$i];
            }else{
                    $right_arr[] = $array[$i];
            }
    }

    $left_arr = quickSort($left_arr);
    $right_arr = quickSort($right_arr);
    return array_merge($left_arr,array($key),$right_arr);

}

/**

  • 选择排序
  • 2层循环
  • 第一层逐个获取数组的值 $array[$i]
  • 第二次遍历整个数组与$array[$i]比较($j=$i+1已经比较的,不再比较,减少比较次数)
  • 如果比$array[$i]小,就交换位置
  • 这样一轮下来就可以得到数组中最小值
  • 以此内推整个外层循环下来就数组从小到大排序了
  • @param array $array 要比较的数组
  • @return array $array 从小到大排序后的数组
    */

function selectSort($array){

    $cnt = count($array);
    for($i=0;$i<$cnt;$i++){
            for($j=($i+1);$j<$cnt;$j++){
                    if($array[$i]>$array[$j]){
                            $tmp = $array[$i];
                            $array[$i] = $array[$j];
                            $array[$j] = $tmp;
                    }
            }
    }
    return $array;

}

/**

  • 二分法查找一个值在数组中的位置
  • @param array $array 操作的数组
  • @param void $val 要查找的值
  • @return int $mid 返回要查找的值在数组中的索引,如果不存在返回-1
    */

function binarySearch($array,$val)
{

    $cnt = count($array);
    $low = 0;
    $high = $cnt - 1;
    while ($low <= $high){
            $mid = intval(($low + $high)/2);
            if($array[$mid] == $val){
                    return $mid;
            }

            if($array[$mid] < $val){
                    $low = $mid + 1;
            }

            if($array[$mid] > $val){
                    $high = $mid - 1;
            }
    }

    return -1;

}

/**

  • 顺序查找(最简单,效率低下)
  • 通过循环数组查找要的值
  • @param array $array 要操作的数组
  • @param void $val 要查找的值
  • @return int 如果存在,返回该值在数组中的索引,否则返回-1
    */

function seqSch($array,$val)
{

    for($i=0;$i<count($array);$i++){
            if($array[$i] == $val)
                    break;
    }

    if($i < count($array)){
            return $i;
    }else{
            return -1;
    }

}

抽象类和方法<转>

可以使用abstract来修饰一个类或者方法。

用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。

抽象类不能被实例化。

抽象方法是只有方法声明,而没有方法的实现内容。
abstract 抽象类

可以使用abstract来修饰一个类。

用abstract修饰的类表示这个类是一个抽象类。

抽象类不能被实例化。

这是一个简单抽象的方法,如果它被直接实例化,系统会报错。
[PHP] view plain copy

<?php  
//定义一个抽象类  
abstract class User  
{  
    public function __toString() {  
        return get_class($this);  
    }   
}  
//实例化这个类会出现错误  
echo new User();  
?>  

下面例子的 NormalUser 继承自 User类,就可以被实例化了。

[php] view plain copy

<?php  
//定义一个抽象类  
abstract class User  
{  
    public function __toString() {  
        return get_class($this);  
    }   
}  
//实例化这个类会出现错误  
echo new User();  
class NormalUser extends User  
{  
}  
$a = new NormalUser();  
echo "这个类" . $a . "的实例";  
?>  

单独设置一个抽象类是没有意义的,只有有了抽象方法,抽象类才有了血肉。下面介绍抽象方法。
abstract 抽象方法

用abstract修饰的类表示这个方法是一个抽象方法。

抽象方法,只有方法的声明部分,没有方法体。

抽象方法没有 {} ,而采用 ; 结束。

一个类中,只要有一个抽象方法,这个类必须被声明为抽象类。

抽象方法在子类中必须被重写。

下面是一个抽象类,其中有两个抽象方法,分别是 setSal() 和 getSal()。用来取回 $sal 员工的工资。

[php] view plain copy

<?php  
abstract class User  
{  
    protected $sal = 0;  
    //这里定义的抽象方法。  
    //注意抽象方法没有方法体,而且方法结束使用 ; 号。  
    abstract function getSal();  
    abstract function setSal();  
    //定义它的__tostring方法  
    public function __toString() {  
        return get_class($this);  
    }   
}   
?>  

既然User类不能被直接继承,我们写一个NormalUser类继承自User类。当我们写成如下代码时,系统会报错。 这个错误告诉我们,在 User类中有两个抽象方法,我们必须在子类中重写这两个方法。

[php] view plain copy

<?php  
abstract class User  
{  
    protected $sal = 0;  
    //这里定义的抽象方法。  
    //注意抽象方法没有方法体,而且方法结束使用 ; 号。  
    abstract function getSal();  
    abstract function setSal();  
    //定义它的__tostring方法  
    public function __toString() {  
        return get_class($this);  
    }   
}  
class NormalUser extends User  
{  
}  
?>   

下面例子,重写了这两个方法,虽然方法体里面 {} 的内容是空的,也算重写了这个方法。注意看重写方法的参数名称,这里只要参数数量一致就可以,不要求参数的名称必须一致。

[php] view plain copy

<?php  
abstract class User  
{  
    protected $sal = 0;  
    //这里定义的抽象方法。  
    //注意抽象方法没有方法体,而且方法结束使用;号。  
    abstract function getSal();  
    abstract function setSal();  
    //定义它的__tostring方法  
    public function __toString() {  
        return get_class($this);  
    }   
}  
class NormalUser extends User  
{  
    function getSal() {  
    }  
    function setSal($sal) {   
    }  
}  
    //这样就不会出错了。  
?>  

下面19-21行,三种写重写的方式都会报错。

19行,缺少参数。

20行,参数又多了。

21行,参数类型不对。(这种写法在以后章节介绍)

一个类中,如果有一个抽象方法,这个类必须被声明为抽象类。

下面这个类不是抽象类,其中定义了一个抽象方法,会报错。

[php] view plain copy

<?php  
class User  
{  
    protected $sal = 0;  
    //这里定义的抽象方法。  
    //注意抽象方法没有方法体,而且方法结束使用;号。  
    abstract function getSal();  
    abstract function setSal();  
    //定义它的__tostring方法  
    public function __toString() {  
        return get_class($this);  
    }   
}  
    //这个类中有两个抽象方法,如果这个类不是抽象的。会报错  
?>  

抽象类继承抽象类

抽象类继承另外一个抽象类时,不用重写其中的抽象方法。

抽象类中,不能重写抽象父类的抽象方法。

这样的用法,可以理解为对抽象类的扩展

下面的例子,演示了一个抽象类继承自另外一个抽象类时,不需要重写其中的抽象方法。

[php] view plain copy

<?php  
abstract class User  
{  
    protected $sal = 0;  
    abstract function getSal();  
    abstract function setSal($sal);   
}  
abstract class VipUser extends User  
{  
}  
?>  

抽象类在被继承后,其中的抽象方法不能被重写。

如果发生重写,系统会报错。

[php] view plain copy

<?php  
abstract class User  
{  
    protected $sal = 0;  
    abstract function getSal();  
    abstract function setSal($sal);   
}  
abstract class VipUser extends User  
{  
    abstract function setSal();   
}  
?>  

抽象类继承抽象类,目的对抽象类的扩展。

[php] view plain copy

<?php  
abstract class User  
{  
    protected $sal = 0;  
    abstract function getSal();  
    abstract function setSal($sal);   
}  
abstract class VipUser extends User  
{  
    protected $commision = 0;  
    abstract function getCommision();  
    abstract function setCommision();  
}  
?>  

在PHP5.1中,抽象类中支持静态抽象方法。下面这个例子,看到静态抽象方法可以声明。实现这个方法时,必须是静态的方法。
静态抽象方法

在PHP5.1中,抽象类中支持静态抽象方法。下面这个例子,看到静态抽象方法可以声明。实现这个方法时,必须是静态的方法。

[php] view plain copy

<?php  
abstract class User  
{  
    protected static  $sal = 0;  
    static abstract function getSal();  
    static abstract function setSal($sal);   
}  
class VipUser extends User  
{  
    static function getSal() {  
        return self::$sal;  
    }  
    static function setSal($sal) {  
        self::$sal = $sal;  
    }  
}  
VipUser::setSal(100);  
echo "you sal is " . VipUser::getSal();  
?>  
//这里的抽象方法好像没有问题   

PHP 数组相关处理方法

//对多维数组按照某个字段进行排序
public function arr_sort($array,$key,$order="asc"){//asc是升序 desc是降序
$arr_nums=$arr=array();
foreach($array as $k=>$v){
$arr_nums[$k]=$v[$key];
}

if($order=='asc'){
asort($arr_nums);
}else{
arsort($arr_nums);
}

foreach($arr_nums as $k=>$v){
$arr[$k]=$array[$k];
}
return $arr;
}


//array_pad函数,数组数组首尾选择性追加$num = array(1=>10,2=>20,3=>30);

$num = array_pad($num,4,40);
print_r($num);//Array ( [0] => 10 [1] => 20 [2] => 30 [3] => 40 )$num = array_pad($num,-5,50);//array_pad(array,size,value)
print_r($num);//Array ( [0] => 50 [1] => 10 [2] => 20 [3] => 30 [4] => 40 ) ?>

size:指定的长度。整数则填补到右侧,负数则填补到左侧。


array_splice()删除数组成员 :
$color = array("red", "green", "blue", "yellow");

count ($color); //得到4
array_splice($color,1,1); //删除第二个元素
print_r(count ($color)); //3echo$color[2]; //yellowecho$color[1]; //blue?>

php 判断文件或目录是否存在有自带的函数,file_exists文件是否存在,判断目录是否存在我们用is_dir就ok了。


//sizeof的使用echo sizeof($array);//7;统计数组元素的个数//array_count_values$num = array(10,20,30,10,20,1,0,10);//统计数组元素出现的次数

print_r(array_count_values($num));//Array ( [10] => 3 [20] => 2 [30] => 1 [1] => 1 [0] => 1 ) ?>

current():每个数组都有一个内部指针指向他的当前单元,初始指向插入到数组中的第一个元素


    /**
     * 把对象转换成数组
     * @param   object  $object 要转换的对象
     * @return  array
     */
    public function objectArray($object) {
        if( count($object)==0 )  return trim((string)$object);
        $result = array();
        $object = is_object($object) ? get_object_vars($object) : $object;
        foreach ($object as $key => $val) {
            $val = (is_object($val) || is_array($val)) ? $this -> objectArray($val) : $val;
            $result[$key] = $val;
        }
        return $result;
    }

//数组处理 ,把二位数组处理成为一维数组
public function array_multi2single($array){
    static $result_array=array();
    foreach($array as $k => $value){
        if(is_array($value)){

            $this -> array_multi2single($value);

        }else{
            $result_array[$k]=$value;
        }
    }
    return $result_array;
}

/**
 * 从数组中删除空白的元素
 * @param  $arr 
 * @param  boolean $trim
 * 
 */
function array_remove_empty(&$arr, $trim = true)     
{     
    foreach ($arr as $key => $value) {     
        if (is_array($value)) {     
            array_remove_empty($arr[$key]);     
        } else {     
            $value = trim($value);     
            if ($value == '') {     
                unset($arr[$key]);     
            } elseif ($trim) {     
                $arr[$key] = $value;     
            }    
        }     
    }     
}