亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP數組的高級遍歷和操作處理方法

2024-09-04 11:45:48
字體:
來源:轉載
供稿:網友

前面我講過簡單的數組遍歷,這些基于foreach,for之類的語句,下面我來介紹數組的高級遍歷方法介紹,各位朋友可參考,這些數組才真用于開發實用性能強,復雜也更高了.

PHP對數組的處理可以稱為該語言最有吸引力的特性之一,它支持70多種數組相關的函數,不論你想翻轉一個數組、判斷某個值在數組中是否存在、將數組轉換成一個字符串還是計算數組的大小,僅僅執行一個現有的函數就可以完成。然而也有一些數組相關的任務對開發者的要求就較高,僅僅知道手冊有某個功能是不能解決的,這些任務就需要對PHP的原始特性有一些深入的理解,還需要一些解決問題的想象力。

多維關聯數組排序

PHP提供了一些數組排序的函數,比如sort(), ksort(),和asort(),但是卻沒有提供對多維關聯數組的排序。

比如這樣的數組:

  1. Array 
  2.   [0] => Array 
  3.     ( 
  4.       [name] => chess 
  5.       [price] => 12.99 
  6.     ) 
  7.   [1] => Array 
  8.     ( 
  9.       [name] => checkers 
  10.       [price] => 9.99 
  11.     ) 
  12.   [2] => Array 
  13.     ( 
  14.       [name] => backgammon 
  15.       [price] => 29.99 
  16.     ) 

要將該數組按照升序排序,你需要自己寫一個函數用于比較價格,然后將該函數作為回調函數傳遞給usort()函數來實現該功能,代碼如下:

  1. function comparePrice($priceA$priceB){ 
  2.     return $priceA['price'] - $priceB['price']; 
  3. usort($games'comparePrice'); 

執行了該程序片段,數組就會被排序,結果如下所示:

  1. Array 
  2.   [0] => Array 
  3.     ( 
  4.       [name] => checkers 
  5.       [price] => 9.99 
  6.     ) 
  7.   [1] => Array 
  8.     ( 
  9.       [name] => chess 
  10.       [price] => 12.99 
  11.     ) 
  12.   [2] => Array 
  13.     ( 
  14.       [name] => backgammon 
  15.       [price] => 29.99 
  16.     ) 

要將該數組按照降序排序,把comparePrice()函數里面的兩個減的數調換位置就可以了.

逆序遍歷數組

PHP的While循環和For循環是遍歷一個數組最常用的方法,但是你怎樣遍歷像下面這個數組呢?

  1. Array 
  2.   [0] => Array 
  3.     ( 
  4.       [name] => Board 
  5.       [games] => Array 
  6.         ( 
  7.           [0] => Array 
  8.             ( 
  9.               [name] => chess 
  10.               [price] => 12.99 
  11.             ) 
  12.           [1] => Array 
  13.             ( 
  14.               [name] => checkers 
  15.               [price] => 9.99 
  16.             ) 
  17.         ) 
  18.     ) 

PHP標準庫中有一個對集合的迭代器iterators類,它不僅僅能夠用于遍歷一些異構的數據結構(比如文件系統和數據庫查詢結果集),也可以對一些不知道大小的嵌套數組的遍歷,比如對上面的數組的遍歷,可以使用RecursiveArrayIterator迭代器進行,代碼如下:

  1. $iterator = new RecursiveArrayIterator($games);  
  2. iterator_apply($iterator'navigateArray'array($iterator)); 
  3. function navigateArray($iterator) {  
  4.  while ($iterator->valid()) {  
  5.   if ($iterator->hasChildren()) {  
  6.    navigateArray($iterator->getChildren());  
  7.   } else {  
  8.    printf("%s: %s"$iterator->key(), $iterator->current()); 
  9.   }  
  10.   $iterator->next();  
  11.  }   

執行該段代碼會給出以下的結果:

name: Board

name: chess

price: 12.99

name: checkers

price: 9.99

過濾關聯數組的結果

假定你得到了如下一個數組,但是你僅僅想操作價格低于$11.99的元素:

  1. Array 
  2.   [0] => Array 
  3.     ( 
  4.       [name] => checkers 
  5.       [price] => 9.99 
  6.     ) 
  7.   [1] => Array 
  8.     ( 
  9.       [name] => chess 
  10.       [price] => 12.99 
  11.     ) 
  12.   [2] => Array 
  13.     ( 
  14.       [name] => backgammon 
  15.       [price] => 29.99 
  16.     ) 

使用array_reduce()函數可以很簡單的實現,代碼如下:

  1. function filterGames($game){ 
  2.  return ($game['price'] < 11.99); 
  3. $names = array_filter($games'filterGames'); 

array_reduce()函數會過濾掉不滿足回調函數的所有的元素,本例子的回調函數就是filterGames,任何價格低于11.99的元素會被留下,其他的會被剔除,該代碼段的執行結果:

  1. Array 
  2.   [1] => Array 
  3.     ( 
  4.       [name] => checkers 
  5.       [price] => 9.99 
  6.     ) 

對象轉換成數組

一個需求就是將對象轉換成數組形式,方法比你想象的簡單很多,僅僅強制轉換就可以了,實例代碼如下:

  1. class Game { 
  2.  public $name
  3.  public $price
  4. $game = new Game(); 
  5. $game->name = 'chess'
  6. $game->price = 12.99; 
  7. print_r(array($game)); 

執行該例子就會產生如下結果:

  1. Array 
  2. [0] => Game Object 
  3.   ( 
  4.     [name] => chess 
  5.     [price] => 12.99 
  6.   ) 

將對象轉換成數組會出現一些不可預料的副作用,比如上面的代碼段,所有的成員變量都是public類型的,但是對于private私有變量的返回結果會變得不一樣,下面是另外一個例子,代碼如下:

  1. class Game { 
  2.  public $name
  3.  private $_price
  4.  public function setPrice($price)  { 
  5.   $this->_price = $price
  6.  } 
  7. $game = new Game(); 
  8. $game->name = 'chess'
  9. $game->setPrice(12.99); 
  10. print_r(array($game));執行該代碼片段: 
  11. Array 
  12. [0] => Game Object 
  13.   ( 
  14.     [name] => chess 
  15.     [_price:Game:private] => 12.99 
  16.   ) 

正如你所看到的,為了進行區分,數組中保存的私有變量的key被自動改變了。

數組的“自然排序”

PHP對于“字母數字”字符串的排序結果是不確定的,舉個例子,假定你有很多圖片名稱存放于數組中,代碼如下:

  1. $arr = array
  2.  0=>'madden2011.png', 
  3.  1=>'madden2011-1.png', 
  4.  2=>'madden2011-2.png', 
  5.  3=>'madden2012.png' 
  6. ); 

你怎樣對這個數組進行排序呢?如果你用sort()對該數組排序,結果是這樣的:

  1. Array 
  2.     [0] => madden2011-1.png 
  3.     [1] => madden2011-2.png 
  4.     [2] => madden2011.png 
  5.     [3] => madden2012.png 

有時候這就是我們想要的,但是我們想保留原來的下標怎么辦?解決該問題可以使用natsort()函數,該函數用一種自然的方法對數組排序,代碼如下:

  1. <?php 
  2. $arr = array
  3.  0=>'madden2011.png'
  4.  1=>'madden2011-1.png'
  5.  2=>'madden2011-2.png'
  6.  3=>'madden2012.png' 
  7. ); 
  8. natsort($arr); 
  9. echo "<pre>"; print_r($arr); echo "</pre>"
  10. ?> 

運行結果:

  1. Array 
  2.     [1] => madden2011-1.png 
  3.     [2] => madden2011-2.png 
  4.     [0] => madden2011.png 
  5.     [3] => madden2012.png 

遍歷過程中的改值操作

引用操作符&

看下面這段代碼中的$array數組,在foreach循環時對$value使用引用操作符,這樣在循環中修改$value的值的時候,便將$array中對應的元素值修改了,代碼如下:

  1. <?php 
  2. $array = array("A"=>1, "B"=>1, "C"=>1, "D"=>1); 
  3. foreach($array as &amp;$value
  4.     $value = 2; 
  5. print_r($array); 
  6. ?> 

上段代碼的輸出如下:

Array ( [A] => 2 [B] => 2 [C] => 2 [D] => 2 ) 

可以看到,$array中各個鍵對應的值都被修改成了2??磥磉@種方法確實奏效。

利用鍵值操作數組的元素

有的時候,數組中表示的可能是一些互相關聯的元素,如果遇到了這些相互關聯的元素中的一個,就將其他元素做一個標記的話,上面的引用肯定就不管用了,這時候修改這些關聯元素的時候,就要使用其對應的鍵值了,先試試看管用不,代碼如下:

  1. <?php 
  2. $array = array("A"=>1, "B"=>1, "C"=>1, "D"=>1); 
  3. foreach($array as $key => $value){ 
  4.     if($key == "B"){ 
  5.         $array["A"] = "CHANGE"
  6.         $array["D"] = "CHANGE"
  7.         print_r($array); 
  8.         echo '<br />'
  9.     } 
  10.  
  11.     if($value === "CHANGE"
  12.         echo $value.'<br />'
  13. print_r($array); 
  14. ?> 

別著急看輸出,我們想象中的應該是什么樣呢?打印修改后的數組,打印一個“CHANGE”,再打印一遍修改后的數組,對嗎?來看一下輸出吧!

Array ( [A] => CHANGE [B] => 1 [C] => 1 [D] => CHANGE )

Array ( [A] => CHANGE [B] => 1 [C] => 1 [D] => CHANGE ) 

咦?怎么個情況?我們的CHANGE哪去了?

按照我們的想法,既然$array已經改變了,那么當遍歷到鍵值為“D”的元素時,應當輸出它的新值“CHANGE”才對!可是事實并不是我們想的那樣,PHP在這里做了什么手腳呢?把上面的代碼稍微修改一下,既然打印數組的時候,“D”=>CHANGE沒錯,那我們修改第二個if語句的判斷條件,代碼如下:

  1. <?php 
  2. $array = array("A"=>1, "B"=>1, "C"=>1, "D"=>1); 
  3. foreach($array as $key => $value){ 
  4.     if($key == "B"){ 
  5.         $array["A"] = "CHANGE"
  6.         $array["D"] = "CHANGE"
  7.         print_r($array); 
  8.         echo '<br />'
  9.     } 
  10.      
  11.     if($array[$key] === "CHANGE"
  12.         echo $value.'<br />'
  13. print_r($array); 
  14. ?> 

猜猜它會輸出什么?$value肯定不會等于“CHANGE”啦!難道等于1么?代碼如下:

Array ( [A] => CHANGE [B] => 1 [C] => 1 [D] => CHANGE )

那么,它確實就是1了。

這究竟是神馬原因呢?翻到PHP文檔的foreach那頁,恍然:

Note: 除非數組是被引用,foreach 所操作的是指定數組的一個拷貝,而不是該數組本身,foreach對數組指針有些副作用,除非對其重置,在 foreach 循環中或循環后都不要依賴數組指針的值。

原來foreach所操作的是指定數組的一個拷貝,怪不得,取$value不管用了呢!理解到這里,上面的問題就解決了,只要在foreach中,直接按照鍵取$array中的元素進行各種判斷賦值操作就可以了。

總結及延伸:PHP的數組遍歷和操作能力確實非常強大,然而對一些稍復雜問題的解決方法卻不是那么明顯,其實在任何領域都是這樣,一個語言和語法提供的都是基本的操作,對于復雜的問題的解決辦法都需要開發者自己的思考、想象力和代碼編寫來完成。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文字幕精品视频| 精品久久久久久| 日韩高清av在线| 国产亚洲精品美女| 91视频国产高清| 日本精品va在线观看| 亚洲国产欧美自拍| www.久久色.com| 日韩av网站电影| 成人福利免费观看| 隔壁老王国产在线精品| 97精品欧美一区二区三区| 精品人伦一区二区三区蜜桃网站| 97香蕉久久超级碰碰高清版| 上原亚衣av一区二区三区| www.亚洲天堂| 自拍偷拍亚洲一区| 国内精品伊人久久| 亚洲色图在线观看| 欧美肥婆姓交大片| 精品无码久久久久久国产| 91久久嫩草影院一区二区| 国产欧美日韩综合精品| 亚洲系列中文字幕| 久久久亚洲天堂| 国产精品99一区| 欧美日韩加勒比精品一区| 国产精品久久久久久久久久99| 亚洲天堂成人在线| 日本免费一区二区三区视频观看| 亚洲第一男人av| 精品福利一区二区| 两个人的视频www国产精品| y97精品国产97久久久久久| 精品毛片三在线观看| 亚洲精品电影久久久| 成人激情视频网| 欧美日韩美女视频| 欧美国产日韩免费| 亚洲国产中文字幕久久网| 亚洲qvod图片区电影| 亚洲精品www久久久| 国产精品狼人色视频一区| 一个人www欧美| 国产欧美日韩精品专区| 久久久久久久一| 久久精品国产精品| 亚洲2020天天堂在线观看| 亚洲女成人图区| 川上优av一区二区线观看| 91精品久久久久久久久中文字幕| 亚洲国产97在线精品一区| 国产精品色悠悠| 亚洲黄色在线看| 成人精品在线视频| 91中文在线观看| 久久久免费电影| 亚洲欧洲午夜一线一品| 国产欧美日韩精品丝袜高跟鞋| 欧美激情视频网| 国产精品永久免费视频| 国产精品视频免费在线| 亚洲色在线视频| 自拍亚洲一区欧美另类| 97香蕉久久超级碰碰高清版| 国产mv久久久| 久久成人免费视频| 日本精品久久中文字幕佐佐木| 韩剧1988在线观看免费完整版| 4p变态网欧美系列| 不卡毛片在线看| 一区二区三欧美| 精品国偷自产在线视频99| 丝袜一区二区三区| 国产精品综合不卡av| 午夜免费在线观看精品视频| 91精品视频免费| 91香蕉电影院| 国产在线精品一区免费香蕉| 超碰日本道色综合久久综合| 高清欧美一区二区三区| 日韩在线视频网| 国产精品三级美女白浆呻吟| 国产精品国产三级国产专播精品人| 成人a级免费视频| 亚洲精品美女视频| 一区二区三区视频免费| 久久久av一区| 欧美日韩在线第一页| 亚洲的天堂在线中文字幕| 国产精品pans私拍| 中文字幕av一区中文字幕天堂| 色久欧美在线视频观看| 国产精品极品在线| 久久夜精品香蕉| 日韩精品极品在线观看| 久久久久久久久久国产| 久久精品久久久久| 狠狠久久亚洲欧美专区| 亚洲一区二区三| 91色精品视频在线| 亚洲视频在线免费观看| 欧美日韩国产专区| 精品中文字幕久久久久久| 国产欧洲精品视频| 国产亚洲精品成人av久久ww| 日韩视频在线免费| 亚洲资源在线看| 神马久久久久久| 国产成人精品av| 午夜精品久久久久久久白皮肤| 欧美激情a在线| 在线丨暗呦小u女国产精品| 亚洲已满18点击进入在线看片| 亚洲人精品午夜在线观看| 久久成人国产精品| 国产不卡av在线免费观看| 国产做受高潮69| 亚洲国产精品久久久| 91chinesevideo永久地址| 欧美日韩一二三四五区| 精品久久久久久中文字幕大豆网| 国产精品久久久久久久天堂| 国产成人一区二区三区电影| 国产综合久久久久久| 欧美日韩福利在线观看| 欧美成人四级hd版| 尤物yw午夜国产精品视频明星| 一区二区国产精品视频| 国产欧美日韩丝袜精品一区| 成人av电影天堂| 亚洲午夜色婷婷在线| 欧美日韩中文字幕在线| 4444欧美成人kkkk| 深夜福利亚洲导航| 亚洲高清一区二| 亚洲视频在线观看网站| 日本亚洲欧洲色| 国产一区二区三区高清在线观看| 日韩中文在线中文网在线观看| 亚洲天堂av综合网| 在线看片第一页欧美| 亚洲男人第一网站| 91麻豆国产语对白在线观看| 最近2019中文字幕mv免费看| 亚洲香蕉成人av网站在线观看| 欧美中文在线视频| 亚洲欧美一区二区精品久久久| 国产69精品久久久久99| 亚洲最新中文字幕| 国产主播在线一区| 欧美成人免费va影院高清| 国产精品在线看| 亚洲国产成人久久综合| 午夜精品理论片| 国产精品99久久久久久久久久久久| 日韩成人在线观看| 国产日韩欧美在线视频观看| 欧美激情一区二区三区在线视频观看| 欧美午夜精品在线| 亚洲激情 国产| 精品视频在线播放色网色视频| 亚洲国产日韩欧美在线99| 亚洲综合中文字幕68页|