国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

php遍歷數組高級操作詳解

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

在php中遍歷數據一般會使用到list,foreach,each其實中一種,但下面的教程可能不會用到,下面我來給各位分別介紹一下遍歷數組高級實例,希望此方法對大家有幫助.

學習程式語言時,總是學學 for,然后再試著用 while 寫出 for 的效果等等的一些練習,來看看沒有 foreach 前,要想要有 foreach 的功能要怎?寫(用 while、list、each 來達成).

在這篇文章看到: PHP的foreach前身寫法,代碼如下:

  1. //舊的寫法 
  2. reset($attributes); 
  3. while (list($key$value) = each($attributes)) { 
  4.     //do something 
  5. }//開源代碼Vevb.com 
  6. //PHP4版本新增 
  7. foreach ($attributes as $key => $value){ 
  8.    //do something 

多維關聯數組排序

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

比如這樣的數組,代碼如下:

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

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

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

usort($games, 'comparePrice');執行了該程序片段,數組就會被排序,結果如下所示:

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

要將該數組按照降序排序,把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.  
  13.           [1] => Array 
  14.             ( 
  15.               [name] => checkers 
  16.               [price] => 9.99 
  17.             ) 
  18.         ) 
  19.     ) 

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

  1. $iterator = new RecursiveArrayIterator($games);  
  2. iterator_apply($iterator'navigateArray'array($iterator)); 
  3.  
  4. function navigateArray($iterator) {  
  5.  while ($iterator->valid()) {  
  6.   if ($iterator->hasChildren()) {  
  7.    navigateArray($iterator->getChildren());  
  8.   } else {  
  9.    printf("%s: %s"$iterator->key(), $iterator->current()); 
  10.   }  
  11.   $iterator->next();  
  12.  }   
  13.  
  14. //執行該段代碼會給出以下的結果: 
  15.  
  16. name: Board 
  17. name: chess 
  18. price: 12.99 
  19. name: checkers 
  20. price: 9.99 

過濾關聯數組的結果

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

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

使用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.  
  5. $game = new Game(); 
  6. $game->name = 'chess'
  7. $game->price = 12.99; 

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.  
  5.  public function setPrice($price)  { 
  6.   $this->_price = $price
  7.  } 
  8.  
  9. $game = new Game(); 
  10. $game->name = 'chess'
  11. $game->setPrice(12.99); 
  12.  
  13. print_r(array($game)); 
  14.  
  15. //執行該代碼片段: 
  16.  
  17. Array 
  18. [0] => Game Object 
  19.   ( 
  20.     [name] => chess 
  21.     [_price:Game:private] => 12.99 
  22.   ) 

正如你所看到的,為了進行區分,數組中保存的私有變量的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.  
  9. natsort($arr); 
  10. echo "<pre>"; print_r($arr); echo "</pre>"
  11. ?> 
  12.  
  13. //運行結果: 
  14.  
  15. Array 
  16.     [1] => madden2011-1.png 
  17.     [2] => madden2011-2.png 
  18.     [0] => madden2011.png 
  19.     [3] => madden2012.png 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大邑县| 多伦县| 广德县| 松原市| 齐河县| 栾城县| 蓝田县| 金寨县| 安国市| 阿城市| 青河县| 肇东市| 长泰县| 鄂尔多斯市| 儋州市| 博罗县| 英山县| 黑水县| 宁明县| 迭部县| 肥东县| 昌吉市| 马山县| 乐山市| 孟村| 桃园县| 沂源县| 平陆县| 七台河市| 舞阳县| 萨迦县| 酉阳| 普格县| 老河口市| 玉溪市| 梨树县| 虹口区| 台北县| 旌德县| 建始县| 连平县|