文章目录
一、合并两个有序数组为一个新的有序数组
/**
* 合并两个有序数组
* @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)
}