常用算法
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);
?>