⑴ php數組排序問題
asort是保持原有的鍵-值關聯下的排序
原有的
array(1,"one",2,"two",3,"three");
實際上是
array(0=>1, 1=>"one", 2=>2, 3=>"two", 4=>3, 5=>"three");
有默認關聯,asort不去改變這種關聯,而sort會破壞重新分配默認關聯鍵
排列的順序,以值的比較為依據。從小大大,升序
值為字元串的靠前,字元串中又按位元組值比較。
其次是數字,比較大小,
再次是數組,先比較數組中元素的多少,在比較元素值的大小
⑵ PHP快速排序演算法實現的原理及代碼詳解
演算法原理
下列動圖來自五分鍾學演算法,演示了快速排序演算法的原理和步驟。
步驟:
從數組中選個基準值
將數組中大於基準值的放同一邊、小於基準值的放另一邊,基準值位於中間位置
遞歸的對分列兩邊的數組再排序
代碼實現
function
quickSort($arr)
{
$len
=
count($arr);
if
($len
<=
1)
{
return
$arr;
}
$v
=
$arr[0];
$low
=
$up
=
array();
for
($i
=
1;
$i
<
$len;
++$i)
{
if
($arr[$i]
>
$v)
{
$up[]
=
$arr[$i];
}
else
{
$low[]
=
$arr[$i];
}
}
$low
=
quickSort($low);
$up
=
quickSort($up);
return
array_merge($low,
array($v),
$up);
}
測試代碼:
$startTime
=
microtime(1);
$arr
=
range(1,
10);
shuffle($arr);
echo
"before
sort:
",
implode(',
',
$arr),
"\n";
$sortArr
=
quickSort($arr);
echo
"after
sort:
",
implode(',
',
$sortArr),
"\n";
echo
"use
time:
",
microtime(1)
-
$startTime,
"s\n";
測試結果:
before
sort:
1,
7,
10,
9,
6,
3,
2,
5,
4,
8
after
sort:
1,
2,
3,
4,
5,
6,
7,
8,
9,
10
use
time:
0.0009009838104248s
時間復雜度
快速排序的時間復雜度在最壞情況下是O(N2),平均的時間復雜度是O(N*lgN)。
這句話很好理解:假設被排序的數列中有N個數。遍歷一次的時間復雜度是O(N),需要遍歷多少次呢?至少lg(N+1)次,最多N次。
1)
為什麼最少是lg(N+1)次?快速排序是採用的分治法進行遍歷的,我們將它看作一棵二叉樹,它需要遍歷的次數就是二叉樹的深度,而根據完全二叉樹的定義,它的深度至少是lg(N+1)。因此,快速排序的遍歷次數最少是lg(N+1)次。
2)
為什麼最多是N次?這個應該非常簡單,還是將快速排序看作一棵二叉樹,它的深度最大是N。因此,快讀排序的遍歷次數最多是N次。
您可能感興趣的文章:PHP快速排序演算法實例分析PHP四種排序演算法實現及效率分析【冒泡排序,插入排序,選擇排序和快速排序】PHP排序演算法之快速排序(Quick
Sort)及其優化演算法詳解PHP遞歸實現快速排序的方法示例php
二維數組快速排序演算法的實現代碼PHP常用排序演算法實例小結【基本排序,冒泡排序,快速排序,插入排序】PHP快速排序quicksort實例詳解
⑶ php7中為什麼不能用
PHP(外文名:PHP: Hypertext Preprocessor,中文名:「超文本預處理器」)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨特的語法混合了C、Java、Perl以及PHP自創的語法。它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML(標准通用標記語言下的一個應用)文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。
php7
1. 不要使用 mysql_ 函數
這一天終於來了,從此你不僅僅「不應該」使用mysql_函數。PHP 7 已經把它們從核心中全部移除了,也就是說你需要遷移到好得多的mysqli_函數,或者更靈活的 PDO 實現。
2. 不要編寫垃圾代碼
這一條可能易於理解,但是會變得越來越重要,因為 PHP 7 的速度提升可能會隱藏你的一些問題。不要僅僅滿足於你的站點速度,因為遷移到 PHP 7 才讓它變快。
為了理解速度有多重要,以及如何把事情做得更好,請看一看我們的文章速度優化入門指南。
作為一名開發者,你應該總是確保按需載入腳本,盡可能連接它們,編寫高效的資料庫查詢,盡可能使用緩存,以及其它。
3. 不要在文件末尾使用 PHP 閉合標簽
你可以看一看,當一個文件以 PHP 代碼結尾時,WordPress 多數核心代碼都把末尾的 PHP 標簽去掉了。實際上,Zend 框架特別禁止了它。PHP 並不需要文件末尾的閉合標簽,並且我們可以通過去掉它來保證不會在後面添加任何的空白字元。
4. 不要做不必要的引用傳遞
我個人不喜歡引用傳遞。我知道有時候它很實用,但是其它情況下它使代碼變得難懂,並且更難預測結果。
據說一些人認為它使代碼運行更快,但是根據一些 PHP 高級程序員所說,這並不正確。
說明引用為什麼不好的一個例子是,PHP 內建了shuffle()和sort()。它們修改原始數組,而不是返回處理後的數組,這很不合邏輯。
5. 不要在循環中執行查詢
在循環中執行查詢非常浪費。它給你的系統施加不必要的壓力,並且可能能夠在循環外部更快獲得相同結果。當我遇到需要這樣的情況時,我通常會使用兩個分離的查詢來解決問題,我會使用它們來構建數據數組。之後我會遍歷數組,並不需要在這個過程中執行查詢。
由於 WordPress 適用於這里,它可能有一些例外。雖然get_post_meta() 會從資料庫獲取大量數據,如果你正在遍歷某個特殊博文的元數據你可以在循環中使用它。這是因為當你第一次調用它的時候,WordPress實際上會獲取所有元數據並緩存它們。後續的調用使用這些緩存數據,沒有資料庫的調用。
弄懂這些的最佳方式是閱讀函數文檔,以及使用類似 Query Monitor 的工具。
6. 不要在 SQL 查詢中使用 *
當然,這個更像 MySQL 的問題,但是我們習慣在 PHP 中編寫 SQL 代碼,所以都差不多。無論如何,如果可以避免的話,不要在SQL 查詢里使用通配符,尤其是資料庫有很多列的時候。
你應該明確指定需要哪些行,並且僅僅獲取它們。這有助於減少所用資源,保護數據,以及讓事情變得盡可能清晰。
對於 SQL,你需要了解所有可用的函數,並且盡可能測試其速度。在計算均值、求和或計算類似數值時,要使用 SQL 函數而不是PHP 函數。如果你不確定某個查詢的速度,測試它並且嘗試一些其它的編譯 — 之後使用最好的那個。
7. 不要信任用戶輸入
信任用戶輸入是不明智的。始終校驗、過濾、轉義、檢查並留好退路。用戶數據存在三個問題:我們開發者並沒有考慮每種可能性,它通常不正確,以及它可能是蓄意破壞。
經過周密考慮的系統可以防護這些威脅。要確保使用類似filter_var()的內建函數檢查適當的值,以及在處理資料庫時轉義(或預編譯)。
WordPress 擁有一些函數來解決問題。詳見文章校驗、轉義和過濾用戶數據。
8. 不要故作聰明
你的目標應該是編寫優雅的代碼,來更清晰地表達你的意圖。你可能能夠通過將任何東西縮短為一個單詞的變數,使用多層的三元邏輯,以及其它手段,從每個頁面中優化 0.01 秒。但這只會給你和你周圍的人產生大麻煩。
合理命名變數,為代碼編寫文檔,優先選擇清晰而不是簡潔。甚至還可以更好,使用標準的面向對象代碼,它本身或多或少就是文檔,不需要一大堆內聯數值。
9. 不要重新發明輪子
PHP 到現在為止有很長時間了,網站被造出來的時間更長。很可能無論你需要造出什麼,一些人之前早就造出來了。不要害怕向他人尋求支持,Github是你的好朋友,Composer也是,Packagist也是。
從日誌工具到調色工具,從性能分析器到單元測試框架,從 Mailchimp API 到 Twitter Bootstrap,每個東西都可以通過按下按鍵(或者敲下命令)來獲取,使用它們吧!
10. 不要忽略其它語言
如果你是個 PHP 程序員,現在有個好機會去至少了解 HTML、CSS、JavaScript 和 MySQL。當你能夠更好地處理這些語言時,就是重新學習 JavaScript 的時機了。JavaScript 並不是 jQuery,你應該合理地學習 JavaScript 來更高效地使用它。
我也打算向你推薦學習面向對象的 PHP,它可以節省時間,並且在代碼規模更大時會變得更好。對於類似 C# 和 Java 的語言,在你了解 OOP 之後,它們也更易於理解。
通過了解包管理器、構建腳本、CoffeeScript、LESS、SASS、YAML 、腳本引擎和其它強大的工具來擴展你的知識面。我強烈向你推薦看一看其它框架,尤其是 Laravel。
當你使用它們出色完成任務時,學習 Ruby、RoR、Android、iPhone 和 Windows Phone 應用開發如何?你可能會認為這毫無意義,因為它們在你的舒適區和工作所需范圍之外,但是這就是它們的意義。每種語言都有一些要學習的實用的東西,以及從沒碰到的新知識。所有 PHP 頂級開發者都懂得很多其它編程語言,這並非偶然。
⑷ php數組函數序列之sort() 對數組的元素值進行升序排序
sort()定義和用法
sort()
函數按升序對給定數組的值排序。
注釋:本函數為數組中的單元賦予新的鍵名。原有的鍵名將被刪除。
如果成功則返回
TRUE,否則返回
FALSE。
語法
sort(array,sorttype)參數
描述
array
必需。輸入的數組。
sorttype
可選。規定如何排列數組的值。可能的值:
SORT_REGULAR
-
默認。以它們原來的類型進行處理(不改變類型)。
SORT_NUMERIC
-
把值作為數字來處理
SORT_STRING
-
把值作為字元串來處理
SORT_LOCALE_STRING
-
把值作為字元串來處理,基於本地設置*。
*:該值是
PHP
4.4.0
和
5.0.2
新加的。在
PHP
6
之前,使用了系統的區域設置,可以用
setlocale()
來改變。自
PHP
6
起,必須用
i18n_loc_set_default()
函數。
例子
復制代碼
代碼如下:
<?php
$my_array
=
array("a"
=>
"Dog",
"b"
=>
"Cat",
"c"
=>
"Horse");
sort($my_array);
print_r($my_array);
?>
輸出:
Array
(
0]
=>
Cat
[1]
=>
Dog
[2]
=>
Horse
)
⑸ php數組內容添加 排序
我拿最簡單的數組寫了個給你參考..主要也是思路問題
$green = array(
0=>array("name"=>"c","score"=>90),
1=>array("name"=>"a","score"=>80),
2=>array("name"=>"d","score"=>80),
3=>array("name"=>"b","score"=>70),
4=>array("name"=>"e","score"=>60),
);
//排名 1 2 2 4 5
//姓名 C A D B E
//成績 90 80 80 70 60
foreach( $green as $k=>$v){
if ($k == 0){
$green[$k]['site']=1;
}else{
$lk = $k - 1;
if ($green[$k]['score'] != $green[$lk]['score']){
$nk=$k +1;
$green[$k]['site']= $nk;
}else{
$green[$k]['site']=$k;
}
}
}
下面是結果
array(5) {
[0]=>
array(3) {
["name"]=> string(1) "c"
["score"]=> int(90)
["site"]=> int(1)
}
[1]=>
array(3) {
["name"]=> string(1) "a"
["score"]=> int(80)
["site"]=> int(2)
}
[2]=>
array(3) {
["name"]=> string(1) "d"
["score"]=> int(80)
["site"]=> int(2)
}
[3]=>
array(3) {
["name"]=>string(1) "b"
["score"]=>int(70)
["site"]=>int(4)
}
[4]=>
array(3) {
["name"]=>string(1) "e"
["score"]=> int(60)
["site"]=>int(5)
}
}
⑹ php 二維數組的排序問題
對二維數組排序,得用到array_multisort()
下面是從php手冊摘出來的例子.具體請根據你的問題查閱手冊.
=========
數據全都存放在名為 data 的數組中。這通常是通過循環從資料庫取得的結果,例如 mysql_fetch_assoc()。
<?php
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);
?>
本例中將把 volume 降序排列,把 edition 升序排列。
現在有了包含有行的數組,但是 array_multisort() 需要一個包含列的數組,因此用以下代碼來取得列,然後排序。
<?php
// 取得列的列表
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}
// 將數據根據 volume 降序排列,根據 edition 升序排列
// 把 $data 作為最後一個參數,以通用鍵排序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?>
數據集合現在排好序了,結果如下:
volume | edition
-------+--------
98 | 2
86 | 1
86 | 6
85 | 6
67 | 2
67 | 7
⑺ PHP數組排序array_multisort函數詳細用法跟排序方法是怎樣的
一、先看最簡單的情況。有兩個數組:
$arr1 = array(1,9,5);
$arr2 = array(6,2,4);
array_multisort($arr1,$arr2);
print_r($arr1); // 得到的順序是1,5,9
print_r($arr2); // 得到的順序是6,4,2
我估計兩個數組的值自始至終都是對應著的:1對應6,9對應2,5對應4。
我們再加多一個數組看看會怎樣:
$arr1 = array(1,9,5);
$arr2 = array(6,2,4);
$arr3 = array(3,7,8);
array_multisort($arr1,$arr2,$arr3);
查看結果,1自始至終都對應6對應3,其它項也是如此。這種對應關系就是手冊中所謂的「排序時保留原有的鍵名關聯」。
另外也可以把每個數組想像成資料庫表的一列。而對應著的1,6,3為一數據行,9,2,7為另一數據行。。。
array_multisort會先按第一個數組(想像成列)排序,如果第一個數組(列)的值相同,則按第二個數組(列)排序。
具體可以用下面的程式來測試:
$arr1 = array(1,9,5,9);
$arr2 = array(6,2,4,1);
$arr3 = array(3,7,8,0);
array_multisort($arr1,$arr2,$arr3);
可以想像這里$arr3的結果是(3,8,0,7)。
二、接下來講解array_multisort的參數。這個函數的參數很靈活。最簡單的情況是如上面所示的以1個或n個數組作為參數,需要注意的是每個數組的項數要一樣,否則會warning導致排序失效。
像這樣array_multisort($arr1,$arr2,$arr3); 默認是所有數組都是升序排列,如果想對$arr2降序,並當作字元串去比較,就要寫成:
array_multisort($arr1, $arr2, SORT_DESC, SORT_STRING, $arr3);
每個array後面可以跟一個排序順序標志或一個排序類型標志,或者兩種標志同時出現。但是每種排序標志在每個數組後面只能出現一個。
詳細如下:
排序順序標志:
SORT_ASC - 按照上升順序排序(默認)
SORT_DESC - 按照下降順序排序
排序類型標志:
SORT_REGULAR - 將項目按照通常方法比較(默認)
SORT_NUMERIC - 將項目按照數值比較
SORT_STRING - 將項目按照字元串比較
三、最後是array_multisort有什麼實際作用。
我們通常有一些多維數組需要排序:
$guys = Array
(
[0] => Array
(
[name] => jake
[score] => 80
[grade] => A
)
[1] => Array
(
[name] => jin
[score] => 70
[grade] => A
)
[2] => Array
(
[name] => john
[score] => 80
[grade] => A
)
[3] => Array
(
[name] => ben
[score] => 20
[grade] => B
)
)
例如我們想按成績倒序排列,如果成績相同就按名字的升序排列。
這時我們就需要根據$guys的順序多弄兩個數組出來:
$scores = array(80,70,80,20);
$names = array('jake','jin','john','ben');
然後
array_multisort($scores, SORT_DESC, $names, $guys);就行了
還能不能更靈活一點呢,每次想排序都要另外弄些數組出來嗎?
其實在qeephp的helper_array類裡面已經封裝得很好,下面是它的兩個方法,需要的人自己修改一下就可以用了:
/**
* 根據指定的鍵對數組排序
*
* 用法:
* @code php
* $rows = array(
* array('id' => 1, 'value' => '1-1', 'parent' => 1),
* array('id' => 2, 'value' => '2-1', 'parent' => 1),
* array('id' => 3, 'value' => '3-1', 'parent' => 1),
* array('id' => 4, 'value' => '4-1', 'parent' => 2),
* array('id' => 5, 'value' => '5-1', 'parent' => 2),
* array('id' => 6, 'value' => '6-1', 'parent' => 3),
* );
*
* $rows = Helper_Array::sortByCol($rows, 'id', SORT_DESC);
* mp($rows);
* // 輸出結果為:
* // array(
* // array('id' => 6, 'value' => '6-1', 'parent' => 3),
* // array('id' => 5, 'value' => '5-1', 'parent' => 2),
* // array('id' => 4, 'value' => '4-1', 'parent' => 2),
* // array('id' => 3, 'value' => '3-1', 'parent' => 1),
* // array('id' => 2, 'value' => '2-1', 'parent' => 1),
* // array('id' => 1, 'value' => '1-1', 'parent' => 1),
* // )
* @endcode
*
* @param array $array 要排序的數組
* @param string $keyname 排序的鍵
* @param int $dir 排序方向
*
* @return array 排序後的數組
*/
static function sortByCol($array, $keyname, $dir = SORT_ASC)
{
return self::sortByMultiCols($array, array($keyname => $dir));
}
/**
* 將一個二維數組按照多個列進行排序,類似 SQL 語句中的 ORDER BY
*
* 用法:
* @code php
* $rows = Helper_Array::sortByMultiCols($rows, array(
* 'parent' => SORT_ASC,
* 'name' => SORT_DESC,
* ));
* @endcode
*
* @param array $rowset 要排序的數組
* @param array $args 排序的鍵
*
* @return array 排序後的數組
*/
static function sortByMultiCols($rowset, $args)
{
$sortArray = array();
$sortRule = '';
foreach ($args as $sortField => $sortDir)
{
foreach ($rowset as $offset => $row)
{
$sortArray[$sortField][$offset] = $row[$sortField];
}
$sortRule .= '$sortArray[\'' . $sortField . '\'], ' . $sortDir . ', ';
}
if (empty($sortArray) || empty($sortRule)) { return $rowset; }
eval('array_multisort(' . $sortRule . '$rowset);');
return $rowset;
}
⑻ php幾種排序演算法實例詳解
四種排序演算法的PHP實現:
1)插入排序(InsertionSort)的基本思想是:
每次將一個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子文件中的適當位置,直到全部記錄插入完成為止。
2)選擇排序(SelectionSort)的基本思想是:
每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排好序的子文件的最後,直到全部記錄排序完畢。
3)冒泡排序的基本思想是:
兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。
4)快速排序實質上和冒泡排序一樣,都是屬於交換排序的一種應用。所以基本思想和上面的冒泡排序是一樣的。
1.sort.php文件如下:
<?php
classSort{
private$arr=array();
private$sort='insert';
private$marker='_sort';
private$debug=TRUE;
/**
*構造函數
*
*@paramarray例如:
$config=array(
'arr'=>array(22,3,41,18),//需要排序的數組值
'sort'=>'insert',//可能值:insert,select,bubble,quick
'debug'=>TRUE//可能值:TRUE,FALSE
)
*/
publicfunctionconstruct($config=array()){
if(count($config)>0){
$this->_init($config);
}
}
/**
*獲取排序結果
*/
publicfunctiondisplay(){
return$this->arr;
}
/**
*初始化
*
*@paramarray
*@returnbool
*/
privatefunction_init($config=array()){
//參數判斷
if(!is_array($config)ORcount($config)==0){
if($this->debug===TRUE){
$this->_log("sort_init_param_invaild");
}
returnFALSE;
}
//初始化成員變數
foreach($configas$key=>$val){
if(isset($this->$key)){
$this->$key=$val;
}
}
//調用相應的成員方法完成排序
$method=$this->sort.$this->marker;
if(!method_exists($this,$method)){
if($this->debug===TRUE){
$this->_log("sort_method_invaild");
}
returnFALSE;
}
if(FALSE===($this->arr=$this->$method($this->arr)))
returnFALSE;
returnTRUE;
}
/**
*插入排序
*
*@paramarray
*@returnbool
*/
privatefunctioninsert_sort($arr){
//參數判斷
if(!is_array($arr)ORcount($arr)==0){
if($this->debug===TRUE){
$this->_log("sort_array(insert)_invaild");
}
returnFALSE;
}
//具體實現
$count=count($arr);
for($i=1;$i<$count;$i++){
$tmp=$arr[$i];
for($j=$i-1;$j>=0;$j--){
if($arr[$j]>$tmp){
$arr[$j+1]=$arr[$j];
$arr[$j]=$tmp;
}
}
}
return$arr;
}
/**
*選擇排序
*
*@paramarray
*@returnbool
*/
privatefunctionselect_sort($arr){
//參數判斷
if(!is_array($arr)ORcount($arr)==0){
if($this->debug===TRUE){
$this->_log("sort_array(select)_invaild");
}
returnFALSE;
}
//具體實現
$count=count($arr);
for($i=0;$i<$count-1;$i++){
$min=$i;
for($j=$i+1;$j<$count;$j++){
if($arr[$min]>$arr[$j])$min=$j;
}
if($min!=$i){
$tmp=$arr[$min];
$arr[$min]=$arr[$i];
$arr[$i]=$tmp;
}
}
return$arr;
}
/**
*冒泡排序
*
*@paramarray
*@returnbool
*/
privatefunctionbubble_sort($arr){
//參數判斷
if(!is_array($arr)ORcount($arr)==0){
if($this->debug===TRUE){
$this->_log("sort_array(bubble)_invaild");
}
returnFALSE;
}
//具體實現
$count=count($arr);
for($i=0;$i<$count;$i++){
for($j=$count-1;$j>$i;$j--){
if($arr[$j]<$arr[$j-1]){
$tmp=$arr[$j];
$arr[$j]=$arr[$j-1];
$arr[$j-1]=$tmp;
}
}
}
return$arr;
}
/**
*快速排序
*@bywww.5wx.org
*@paramarray
*@returnbool
*/
privatefunctionquick_sort($arr){
//具體實現
if(count($arr)<=1)return$arr;
$key=$arr[0];
$left_arr=array();
$right_arr=array();
for($i=1;$i<count($arr);$i++){
if($arr[$i]<=$key)
$left_arr[]=$arr[$i];
else
$right_arr[]=$arr[$i];
}
$left_arr=$this->quick_sort($left_arr);
$right_arr=$this->quick_sort($right_arr);
returnarray_merge($left_arr,array($key),$right_arr);
}
/**
*日誌記錄
*/
privatefunction_log($msg){
$msg='date['.date('Y-m-dH:i:s').']'.$msg.' ';
return@file_put_contents('sort_err.log',$msg,FILE_APPEND);
}
}
/*Endoffilesort.php*/
/*Locationhtdocs/sort.php*/
2.sort_demo.php文件如下:
<?php
require_once('sort.php');
$config=array(
'arr'=>array(23,22,41,18,20,12,200303,2200,1192),
//需要排序的數組值
'sort'=>'select',
//可能值:insert,select,bubble,quick
'debug'=>TRUE
//可能值:TRUE,FALSE
);
$sort=newSort($config);
//var_mp($config['arr']);
var_mp($sort->display());
/*Endofphp*/