欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

常用算法

程序员文章站 2022-07-12 13:15:25
...

PHP 通过一个节点找出所有父节点

<?php
    //测试数据
    $arr = [
        ['id'=>8,'pid'=>7,'username'=>'test3'],
        ['id'=>7,'pid'=>6,'username'=>'test3'],
        ['id'=>6,'pid'=>2,'username'=>'test3'],
        ['id'=>5,'pid'=>2,'username'=>'test3'],
        ['id'=>4,'pid'=>1,'username'=>'test3'],
        ['id'=>3,'pid'=>1,'username'=>'test2'],
        ['id'=>2,'pid'=>1,'username'=>'test1'],
        ['id'=>1,'pid'=>0,'username'=>'admin'],
    ];
    //想不到好办法了,用了超全局变量    
    $GLOBALS['ids']  = [];
    getData($arr,1);
    function getData($arr,$id){
        //如果为0表示,没有父级了
          if($id == 0 ) return 0;
        foreach($arr as $k =>$v) {
            if($v['id'] == $id) {
                if($v['pid'] != 0 ) $GLOBALS['ids'][] = $v['pid'];
                getData($arr,$v['pid']);
            }
        }
    }
#############################################################################

PHP获取数组中重复最多的元素

$array = array(1, 1, 1, 54, 3,4, 3,4, 3, 14, 3,4, 3,7,8,9,12,45,66,5,7,8,9,2,45);
$array = array_count_values($array);  // 统计数组中所有值出现的次数
arsort($array); // 按照键值对关联数组进行降序排序
$first = reset($array);
$first_key = key($array);
echo("数组中数字{$first_key}重复次数最多,为:{$first}次");

#############################################################################

一. 手写arraysort 
PHP的一维数组排序函数:
sort  对数组的值按照升序排列(rsort降序),不保留原始的键
ksort 对数组的键按照升序排列(krsort降序) 保留键值关系
asort 对数组的值按照升序排列(arsort降序),保留键值关系
方法: 取出要排序的值组成值数组(为一维数组),按要求对值进行排序(保持键值关系),遍历值数组,按照键对应赋值给结果数组。
复制代码
function arraySort($array,$keys,$sort='asc') {
    $newArr = $valArr = array();
    foreach ($array as $key=>$value) {
        $valArr[$key] = $value[$keys];
    }
    ($sort == 'asc') ?  asort($valArr) : arsort($valArr);
    reset($valArr);
    foreach($valArr as $key=>$value) {
        $newArr[$key] = $array[$key];
    }
    return $newArr;
}
二.
<?php
$data = array(
  array(
    'id' => 5698,
    'first_name' => 'Bill',
    'last_name' => 'Gates',
  ),
  array(
    'id' => 4767,
    'first_name' => 'Steve',
    'last_name' => 'Aobs',
  ),
  array(
    'id' => 3809,
    'first_name' => 'Mark',
    'last_name' => 'Zuckerberg',
  )
);

//根据字段last_name对数组$data进行降序排列
$last_names = array_column($data,'last_name');
array_multisort($last_names,SORT_DESC,$data);
var_dump($data);
?>

#############################################################################

PHP 计算两个特别大的整数实例代码

function getIntAdd($a,$b){
$c = '';
$bCount = strlen($b);
$aCount = strlen($a);
$count = max($bCount,$aCount);
$aDiff = $count - $aCount;
$bDiff = $count - $bCount;
for($i = $count - 1;$i >= 0;$i--){
$aVal = $count - $i <= $aCount ? intval($a[$i - $aDiff]) : 0;
$bVal = $count - $i <= $bCount ? intval($b[$i - $bDiff]) : 0;
$v = $aVal + $bVal;
if(strlen($c) > 0 && strlen($c) >= $count - $i){
$c = ($v + intval($c[0])).substr($c,1,strlen($c) - 1);
}else{
$c = $v.$c.'';
}
}
return $c;
}
$a = '23490234328490289048902384908392849238';
$b = '234320498324982390489328498230984982399290384902384';
$c = getIntAdd($a,$b);
print_r($c);

#############################################################################

队列是一种线性表,按照先进先出的原则进行
单向队列:只能从头进,从尾出
双向队列:头尾都可以进出
<?php
class Deque{
    private $queue=array();
    
    function addFirst($item){//头入队
        return array_unshift($this->queue,$item);
    }
    function addLast($item){//尾入队
        return array_push($this->queue,$item);
    }
    function removeFirst(){//头出队
        return array_shift($this->queue);
    }
    function removeLast(){//尾出队
        return array_pop($this->queue);
    }
    function show(){//显示
        echo implode(" ",$this->queue);
    }
    function clear(){//清空
        unset($this->queue);
    }
    function getFirst(){
        return array_shift($this->queue);
    }
    function getLast(){
        return array_pop($this->queue);
    }
    function getLength(){
        return count($this->queue);
    }
}
$q=new Deque();
$q->addFirst(1);
$q->addLast(5);
$q->removeFirst();
$q->removeLast();
$q->addFirst(2);
$q->addLast(4);
$q->show();

#############################################################################

PHP实现统计所有字符在字符串中出现次数的方法

<?php

//统计字符串中出现的字符,出现次数
echo '<pre>';
$str = 'aaabbccqqwweedfghhjffffffffggggggggg';//字符串示例
echo $str.'<br/>';
$strRecord=array();//把出现过的字符记录在此数组中,如果记录有,则不记录,
for($i=0;$i<strlen($str);$i++){
 $found = 0;//默认设置为没有遇到过
 foreach((array)$strRecord as $k=>$v){
  if($str[$i] == $v['key']){
   $strRecord[$k]['count'] += 1;//已经遇到,count + 1;
   $found = 1;//设置已经遇到过的,标记
   continue;//如果已经遇到,不用再循环记录数组了,继续下一个字符串比较
  }
 }
 if(!$found){
  $strRecord[] = array('key'=>$str[$i],'count'=>1);//记录没有遇到过的字符串
 }
}
print_r($strRecord);

?>

#############################################################################

php求一个字符串在另一个字符串中出现的次数

function check($str1,$str2){
        $len1 = strlen($str1);
        //echo $len1;
        $len2 = strlen($str2);
        $k = 0;
        $j = 0;
        $count = 0;
         for ($i=0; $i < $len2 ; $i++) {
             if ($str2{$i} == $str1{$j} && $j < $len1 ) {
                 $k ++;
                 $j ++;
             if($k == $len1){
                 $count ++;
                 $k = 0;
                 $j = 0;
              }
             }
             else{
                 $k = 0;
                 $j = 0;
             }
        }
        echo $count;
     }

#############################################################################

/***PHP编程在字符串中查找连续出现的最长子字符串***/
 $s='fsafassssssssssssssssssssfdslkfslfjl';
  $max='';
  while($s<>''){
    $i=0;
    while($i<strlen($s) && $s[$i]==$s[0]) $i++;
    if ($i>strlen($max)){
      $max=substr($s,0,$i);
    }
    $s=substr($s,$i);
  }
  echo $max;
#############################################################################

<?  
//二分查找(数组里查找某个元素)  
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 bubble_sort($arr) {
    $n=count($arr);
    for($i=0;$i<$n-1;$i++){
        for($j=$i+1;$j<$n;$j++) {
            if($arr[$j]<$arr[$i]) {
                $temp=$arr[$i];
                $arr[$i]=$arr[$j];
                $arr[$j]=$temp;
            }
        }
    }
    return $arr;
}

===========================================================================================
/***快速排序***/
function quick_sort($arr) {
    $n=count($arr);
    if($n<=1)
        return $arr;
    $key=$arr[0];
    $left_arr=array();
    $right_arr=array();
    for($i=1;$i<$n;$i++) {
        if($arr[$i]<=$key)
            $left_arr[]=$arr[$i];
        else
            $right_arr[]=$arr[$i];
    }
    $left_arr=quick_sort($left_arr);
    $right_arr=quick_sort($right_arr);
    return array_merge($left_arr,array($key),$right_arr);
}
===========================================================================================
/***选择排序***/
function select_sort($arr) {
    $n=count($arr);
    for($i=0;$i<$n;$i++) {
        $k=$i;
        for($j=$i+1;$j<$n;$j++) {
           if($arr[$j]<$arr[$k])
               $k=$j;
        }
        if($k!=$i) {
            $temp=$arr[$i];
            $arr[$i]=$arr[$k];
            $arr[$k]=$temp;
        }
    }
    return $arr;
}
===========================================================================================
/***插入排序***/
function insertSort($arr) {
    $n=count($arr);
    for($i=1;$i<$n;$i++) {
        $tmp=$arr[$i];
        $j=$i-1;
        while($arr[$j]>$tmp) {
            $arr[$j+1]=$arr[$j];
            $arr[$j]=$tmp;
            $j--;
            if($j<0)
                break;
        }
    }
    return $arr;
}

#############################################################################

/***PHP翻转中文字符串***/
function reverse($str){
    $r = array();
    for($i=0; $i<mb_strlen($str); $i++){
        $r[] = mb_substr($str, $i, 1, 'UTF-8');
    }
    return implode(array_reverse($r));
}
echo reverse('www.111cn.net天涯PHP博客');

/***如何实现字符串翻转?***/
<?php
function reverse($var){
  $res="";
  for($i=0,$j=strlen($var);$i<$j;$i++){
    $res=$var[$i].$res;
  } 
  return $res;
}
$tmpvar="wofang";
$res=reverse($tmpvar);
echo $res;
?>

#############################################################################

/***PHP计算两个文件的相对路径***/
function getrpath($path, $conpath){
    $pathArr = explode('/', $path);
    $conpathArr = explode('/', $conpath);
    $dismatchlen = 0;
    for($i=0; $i<count($pathArr); $i++){
        if($conpathArr[$i] != $pathArr[$i]){
            $dismatchlen = count($pathArr) - $i;
            $arrleft = array_slice($pathArr, $i);//array_slice从数组的第几个元素开始取出,并返回数组中的其余元素:
            break;
        }
    }
    return str_repeat('../', $dismatchlen).implode('/', $arrleft);//str_repeat 把字符串 "../" 重复 几 次:
}

#############################################################################

/***能够遍历一个文件夹下的所有文件和子文件夹***/
function sdir($dir){
    $files = scandir($dir);
    for ($i=0;$i <count($files);$i++){
        if ($files[$i]=='.' or $files[$i]=='..') unset($files[$i]);
        if (is_dir($files[$i])) $files[$i]=sdir($files[$i]);
    }
    return $files;
}

#############################################################################

/***php递归函数求阶乘***/
<?php  
 function demo($a)  {  
     if($a > 1)  {  
         $r=$a*demo($a-1);  
     }else  {  
         $r=$a;  
     }  
    return $r;  
 }  
 $a=6;  
 echo $a."的阶乘的值".demo($a);  
?> 

上一篇: 常用算法

下一篇: 常用算法