php查找數(shù)組元素各種方法總結(jié)
來(lái)源:程序員人生 發(fā)布時(shí)間:2013-12-07 02:40:21 閱讀次數(shù):2983次
在php中數(shù)據(jù)查詢(xún)可以分類(lèi)一維數(shù)組查找與多維數(shù)組查找了,如果是簡(jiǎn)單的一維數(shù)組我們可以直接使用in_array,array_search 與遍歷來(lái)實(shí)例了,如果是多維數(shù)組就需要使用其它辦法。
對(duì)于一維數(shù)組我們可以如下操作:
in_array 函數(shù)在數(shù)組中搜索給定的值,in_array(value,array,type) type 可選,如果設(shè)置該參數(shù)為 true,則檢查搜索的數(shù)據(jù)與數(shù)組的值的類(lèi)型是否相同。
array_key_exists() 函數(shù)判斷某個(gè)數(shù)組中是否存在指定的 key,如果該 key 存在,則返回 true,否則返回 false,array_key_exists(key,array)
array_search() 函數(shù)與 in_array() 一樣,在數(shù)組中查找一個(gè)鍵值。如果找到了該值,匹配元素的鍵名會(huì)被返回。如果沒(méi)找到,則返回 false。array_search(value,array,strict)
從這里來(lái)看,在數(shù)據(jù)量不大的時(shí)候,比如小于1000,查找用哪一種都行,都不會(huì)成為瓶頸;當(dāng)數(shù)據(jù)量比較大的時(shí)候,用array_key_exists比較合適,當(dāng)然這里array_key_exists占用的內(nèi)存比較大,經(jīng)測(cè)算二分法查找數(shù)組是否包含某一元素,兼容正反序,代碼實(shí)現(xiàn):
- <?php
- $searchValue = (int)$_GET['key'];
- function search(array $array, $value)
- {
- $max = count($array)-1;
- $min = 0;
- $isAscSort = $array[$min] < $array[$max];
- while (TRUE) {
- $sum = $min+$max;
- $midKey = (int)($sum%2 == 1 ? ceil($sum/2) : $sum/2);
- if ($max < $min) {
- return -1;
- } else if ($value == $array[$midKey]) {
- return 1;
- } else if ($value > $array[$midKey]) {
- $isAscSort ? $min = $midKey+1 : $max = $midKey-1;
- } else if ($value < $array[$midKey]) {
- $isAscSort ? $max = $midKey-1 : $min = $midKey+1;
- }
- }
- }
- $array = array(
- '4', '5', '7', '8', '9', '10', '11', '12'
- );
-
- echo search($array, $searchValue);
-
- rsort($array);
- echo search($array, $searchValue);
例二,PHP 查找數(shù)組第i小元素,代碼如下:
- <?php
- #隨機(jī)選擇第i小的數(shù)字,用隨機(jī)快排實(shí)現(xiàn)
-
- #交換元素
- function swap(&$arr, $i, $j) {
- $temp = $arr[$i];
- $arr[$i] = $arr[$j];
- $arr[$j] = $temp;
- }
-
- #隨機(jī)劃分
- function randomized_partition(&$arr, $begin, $end) {
- $rand_inx = rand($begin, $end);
- swap($arr, $begin, $rand_inx);
- return partition($arr, $begin, $end);
- }
-
- #劃分
- function partition(&$arr, $begin, $end) {
- #以第一個(gè)元素作為中樞元素
- $pivot = $begin;
- $low = $begin;
- $high = $end;
-
- while ($low < $high) {
- while ($low < $high && $arr[$low] <= $arr[$pivot]) {
- $low++;
- }
-
- while ($low < $high && $arr[$high] >= $arr[$pivot]) {
- $high--;
- }
-
- swap($arr, $low, $high);
- }
-
- #交換中樞元素
- if ($arr[$pivot] < $arr[$low]) {
- $low--;
- }
- swap($arr, $pivot, $low);
- return $low;
- }
-
- #快速排序,此處沒(méi)用到
- function quick_sort(&$arr, $begin, $end) {
- $q = randomized_partition($arr, $begin, $end);
- if ($q > $begin) {
- quick_sort($arr, $begin, $q - 1);
- }
- if ($q < $end) {
- quick_sort($arr, $q + 1, $end);
- }
- }
-
- #選取第i小的數(shù)
- function randomized_select(&$arr, $begin, $end, $i) {
- if ($begin == $end) {
- return $arr[$begin];
- }
-
- $q = randomized_partition($arr, $begin, $end);
- $k = $q - $begin + 1; #k代表小于等于q的元素個(gè)數(shù)
-
- if ($k == $i) { #如果k=i,說(shuō)明q就是第i小的元素坐標(biāo)
- return $arr[$q];
- } else if ($i < $k) { #如果i<k,說(shuō)明第i小的元素位于q的左邊
- return randomized_select($arr, $begin, $q - 1, $i);
- } else { #第i小的元素位于q的右邊,此時(shí)查找右邊的第i-k小的元素
- return randomized_select($arr, $q + 1, $end, $i - $k);
- }
- }
-
- $arr = array(1, 5, 3, 7, 0, 0, 8, 4, 2, 9, 11);
- $t = randomized_select($arr, 0, count($arr) - 1, 8);
- print_r("The 8th minimum element: {$t}");
- echo "<br>";
- quick_sort($arr, 0, count($arr) - 1);
- print_r($arr);
- ?>
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)