程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php查找數組元素各種方法總結

php查找數組元素各種方法總結

編輯:關於PHP編程

在php中數據查詢可以分類一維數組查找,與多維數組查找了,如果是簡單的一維數組我們可以直接使用in_array ,array_search 與遍歷來實例了,如果是多維數組就需要使用其它辦法。

對於一維數組我們可以如下操作

in_array  '函數在數組中搜索給定的值。in_array(value,array,type)type 可選。如果設置該參數為 true,則檢查搜索的數據與數組的值的類型是否相同。

array_key_exists 'array_key_exists() 函數判斷某個數組中是否存在指定的 key,如果該 key 存在,則返回 true,否則返回 false。array_key_exists(key,array)

array_search 'array_search() 函數與 in_array() 一樣,在數組中查找一個鍵值。如果找到了該值,匹配元素的鍵名會被返回。如果沒找到,則返回 false。array_search(value,array,strict)

從這裡來看,在數據量不大的時候,比如小於1000,查找用哪一種都行,都不會成為瓶頸;
當數據量比較大的時候,用array_key_exists比較合適。
當然這裡array_key_exists占用的內存比較大,經測算

二分法查找數組是否包含某一元素,兼容正反序,代碼實現:

 代碼如下 復制代碼

<?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 查找數組第i小元素

 代碼如下 復制代碼

<?php
     #隨機選擇第i小的數字,用隨機快排實現
    
     #交換元素
     function swap(&$arr, $i, $j) {
         $temp = $arr[$i];
         $arr[$i] = $arr[$j];
         $arr[$j] = $temp;
     }
 
     #隨機劃分
     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) {
         #以第一個元素作為中樞元素
         $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;
     }
 
     #快速排序,此處沒用到
     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小的數
     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的元素個數
 
         if ($k == $i) { #如果k=i,說明q就是第i小的元素坐標
             return $arr[$q];
         } else if ($i < $k) { #如果i<k,說明第i小的元素位於q的左邊
             return randomized_select($arr, $begin, $q - 1, $i);
         } else { #第i小的元素位於q的右邊,此時查找右邊的第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);
 ?>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved