PHP算法小刀


一、合并两个有序数组为一个新的有序数组

/**
 * 合并两个有序数组
 * @param $array
 * @param $merge
 */
public static function arrayMerge($array, $merge){
    $arr_len = count($array); //原数组长度
    $mer_len = count($merge); //合并数组长度
    $len = $arr_len + $mer_len; //合并后大数组的长度
    
    //如果被合并的数组的第一个元素 大于等于 原数组的最后一个元素,则直接拼接到原数组的末尾
    if($array[$arr_len -1] <= $merge[0]){
        $array = array_merge($array, $merge);
        return $array;
    }
    
    $arr_index = $arr_len -1;
    $mer_index = $mer_len -1;
    $index = $len - 1;
    $temp = [];
    while(($arr_index >= 0) && ($mer_index >= 0)) {
        /*if($array[$arr_index] >= $merge[$mer_index]){
            $temp[$index] = $array[$arr_index];
            $arr_index--;
            $index--;
        }else{
            $temp[$index] = $merge[$mer_index];
            $mer_index--;
            $index--;
        }*/
      
      // 从数组的最后一个元素开始取待合并的两个数组的最后一个值
      $temp[$index--] = $array[$arr_index] >= $merge[$mer_index] ? $array[$arr_index--] : $merge[$mer_index--];
        
    }
    
    //原数组剩余的元素拼接到新数组中  
    // array_slice($array, $offect, $len) 截取数组的部分
    if($arr_index >= 0){
        return $temp + array_slice($array,0,$arr_index+1);
    }
    
    //待合并数组剩余的元素拼接到新数组中
    if($mer_index >= 0){
        return $temp + array_slice($merge, 0, $mer_index+1);
    }
}

二、从一个数组中获取重复的值,并按照重复次数排序

/**
 * 获取一个数组中重复的值,并按照重复次数排序
 * @param $arr
 */
public static function arrayCountSort($arr){
    
    //获取一个数组中值以及出现的次数  返回值[val1=>count1,val2=>count2,...]
    $single_arr = array_count_values($arr);
    
    //r按值倒序排序  a保持索引关系 asort   对比:sort/rsort 重新0开始索引下表
    arsort($single_arr);
    var_dump($single_arr);
}

//input  $arr = [1, 3, 4, 5, 1, 3, 5, 6, 7, 5, 4, 3, 2, 1, 8, 6,10,6, 7, 8, 9, 10, 2, 3, 5];

//output  Array ( [3] => 4 [5] => 4 [1] => 3 [6] => 3 [4] => 2 [7] => 2 [2] => 2 [8] => 2 [10] => 2 [9] => 1 )

三、二分查找

public static function middleSearch($array, $val){
    $len = count($array);
    if($len <= 1){
        var_dump($array);
        return isset($array[0]) && $val == $array[0];
    }
    
    /*$mid = floor($len/2);  //递归方式
    if($val == $array[$mid - 1]){
        return true;
    }elseif ($val < $array[$mid-1]){
        self::middleSearch(array_slice($array, 0, $mid),$val);
    }else{
        self::middleSearch(array_slice($array, $mid, $len), $val);
    }*/
    
    //while 循环方式
    $low = 0;
    $high = $len;
    while ($low < $high){
        $mid = floor(($low + $high) / 2);
        if( $val == $array[$mid]){
            return true;
        } elseif ($val < $array[$mid]){
            $high = $mid - 1;
        } else {
            $low = $mid + 1;
        }
    }
    return false;
}

四、从一个字符串中处理特定数据

/**
 * 设计并实现一个PHP函数,将url(其中/1/、 /pn2/有可能存在,有可能不存在)
 * http://bj.58.com/chaoyang/zufang/1/e3i12j2k4m2n3o3y6z3/pn2/?param9310=1&from=58.com
 * 中e3i2j2k4m2n3o3y6z3提取出来,并按照e3,i12,j2,k4等方式进行拆分。 字母+数字组合
 */
public static function pregMatch(){
    /*$label = 'content/112'; //http://bj.58.com/chaoyang/zufang/1/ e3i12j2k4m2n3o3y6z3/pn2/?param9310=1&from=58.com
    $a = preg_match('#(\w+)/(\d+)#i', $label, $mc);
    var_dump($a);
    var_dump($mc);
    */

    $label = 'http://bj.58.com/chaoyang/zufang/1/e3i12j2k4m2n3o3y6z3/pn2/?param9310=1&from=58.com';
    //$a = preg_match('#(\w+)/(\d+)#i', $label, $mc);
    $a = pathinfo($label);
    var_dump($a);
    $str = strstr($a['dirname'], 'zufang');
    var_dump($str);
    $new_Str = str_replace(['zufang/','1/','/pn2'], '', $str);
    var_dump($new_Str);s
    $rest_arr = preg_split("/([a-z]\d+)/", $new_Str, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    var_dump($rest_arr);
}

array(4) {
  ["dirname"]=>
  string(58) "http://bj.58.com/chaoyang/zufang/1/e3i12j2k4m2n3o3y6z3/pn2"
  ["basename"]=>
  string(24) "?param9310=1&from=58.com"
  ["extension"]=>
  string(3) "com"
  ["filename"]=>
  string(20) "?param9310=1&from=58"
}
string(32) "zufang/1/e3i12j2k4m2n3o3y6z3/pn2"
string(19) "e3i12j2k4m2n3o3y6z3"
array(9) {
  [0]=>
  string(2) "e3"
  [1]=>
  string(3) "i12"
  [2]=>
  string(2) "j2"
  [3]=>
  string(2) "k4"
  [4]=>
  string(2) "m2"
  [5]=>
  string(2) "n3"
  [6]=>
  string(2) "o3"
  [7]=>
  string(2) "y6"
  [8]=>
  string(2) "z3"
}

五、数组合并

$a=[1,2,3],$b=[1,4,6],$c=[‘a’=>1,’b’=>2],$d=[‘a’=>2,’c’=>4], 写出合并$a,$b 的几种方法和结果

5.1 相同字符串键

相同字符串键合并

5.2 相同数字键

相同数字键数组合并

$arr1 = [2=> 23, '5'=> 34, 'c'=> 'ccc', 'ab'=> 'ab'];
$arr2 = [5=> 90, '6'=> 56, 'ab'=> 'abba'];
var_dump(array_merge($arr1, $arr2), $arr1 + $arr2);

array(6) {
  [0]=>int(23)
  [1]=>int(34)
  ["c"]=>string(3) "ccc"
  ["ab"]=>string(4) "abba"
  [2]=> int(90)
  [3]=> int(56)
}
array(5) {
  [2]=> int(23)
  [5]=> int(34)
  ["c"]=> string(3) "ccc"
  ["ab"]=> string(2) "ab"
  [6]=> int(56)
}

注意: PHP数组的索引不能是纯正数的字符串, 例如 $arr[‘5’] 的key其实是整数5

六、获取数组的子集

/** 获取一个数组的子集
 * @param $array
 * @return array
 */
public static function children($array){
    $count = count($array);
    $children = [];
    for ($i = 0; $i< $count; $i ++){
        if(!$children){
            $children[0] = $array[$i];
        }else{
            foreach ($children as $child){
                if(!is_array($child)){
                   $child = [$child];
                }
                $children[] = array_merge($child, [$array[$i]]);
            }
            $children[] = $array[$i];
        }
    }
    return $children;
}

var_dump(faceTest::children([1,2,3]));

array(7) {
  [0]=> int(1)
  [1]=>array(2) {
    [0]=> int(1)
    [1]=> int(2)
  }
  [2]=> int(2)
  [3]=>array(2) {
    [0]=> int(1)
    [1]=> int(3)
  }
  [4]=> array(3) {
     [0]=> int(1)
     [1]=> int(2)
     [2]=> int(3)
  }
  [5]=> array(2) {
    [0]=> int(2)
    [1]=> int(3)
  }
  [6]=> int(3)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baiyyxx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值