給定鍵或屬性名稱檢索數組元素或對象屬性的值

1、對於一個二維數組,如下,我們現在需要遍歷所有的id和name,你會怎麼做呢?

 0 => 
    array (size=15)
      'id' => string '1' (length=1)
      'parent_id' => string '0' (length=1)
      'name' => string '手機' (length=6)
      'brief' => string 'mobile' (length=6)
      'is_nav' => string '1' (length=1)
      'banner' => string '' (length=0)
      'keywords' => string '' (length=0)
      'description' => string '' (length=0)
      'redirect_url' => string '' (length=0)
      'sort_order' => string '50' (length=2)
      'status' => string '1' (length=1)
      'created_at' => string '1422858315' (length=10)
      'updated_at' => string '1422858315' (length=10)
      'created_by' => string '0' (length=1)
      'updated_by' => string '0' (length=1)
  1 => 
    array (size=15)
      'id' => string '2' (length=1)
      'parent_id' => string '0' (length=1)
      'name' => string '電腦' (length=6)
      'brief' => string 'computer' (length=8)
      'is_nav' => string '1' (length=1)
      'banner' => string '' (length=0)
      'keywords' => string '' (length=0)
      'description' => string '' (length=0)
      'redirect_url' => string '' (length=0)
      'sort_order' => string '50' (length=2)
      'status' => string '1' (length=1)
      'created_at' => string '1422858539' (length=10)
      'updated_at' => string '1422858539' (length=10)
      'created_by' => string '0' (length=1)
      'updated_by' => string '0' (length=1)
  2 => 
    array (size=15)
      'id' => string '3' (length=1)
      'parent_id' => string '1' (length=1)
      'name' => string '蘋果' (length=6)
      'brief' => string 'iphone' (length=6)
      'is_nav' => string '1' (length=1)
      'banner' => string '' (length=0)
      'keywords' => string '' (length=0)
      'description' => string '' (length=0)
      'redirect_url' => string '' (length=0)
      'sort_order' => string '50' (length=2)
      'status' => string '1' (length=1)
      'created_at' => string '1422858566' (length=10)
      'updated_at' => string '1422858566' (length=10)
      'created_by' => string '0' (length=1)
      'updated_by' => string '0' (length=1)
  3 => 
    array (size=15)
      'id' => string '4' (length=1)
      'parent_id' => string '1' (length=1)
      'name' => string '三星' (length=6)
      'brief' => string 'sansung' (length=7)
      'is_nav' => string '1' (length=1)
      'banner' => string '' (length=0)
      'keywords' => string '' (length=0)
      'description' => string '' (length=0)
      'redirect_url' => string '' (length=0)
      'sort_order' => string '50' (length=2)
      'status' => string '1' (length=1)
      'created_at' => string '1422858593' (length=10)
      'updated_at' => string '1422858593' (length=10)
      'created_by' => string '0' (length=1)
      'updated_by' => string '0' (length=1)
  4 => 
    array (size=15)
      'id' => string '5' (length=1)
      'parent_id' => string '2' (length=1)
      'name' => string '臺式機' (length=9)
      'brief' => string '' (length=0)
      'is_nav' => string '0' (length=1)
      'banner' => string '' (length=0)
      'keywords' => string '' (length=0)
      'description' => string '臺式機電腦' (length=15)
      'redirect_url' => string '' (length=0)
      'sort_order' => string '50' (length=2)
      'status' => string '1' (length=1)
      'created_at' => string '1424857244' (length=10)
      'updated_at' => string '1424857244' (length=10)
      'created_by' => string '0' (length=1)
      'updated_by' => string '0' (length=1)
  5 => 
    array (size=15)
      'id' => string '6' (length=1)
      'parent_id' => string '2' (length=1)
      'name' => string '筆記本' (length=9)
      'brief' => string '' (length=0)
      'is_nav' => string '0' (length=1)
      'banner' => string '' (length=0)
      'keywords' => string '' (length=0)
      'description' => string '筆記本電腦' (length=15)
      'redirect_url' => string '' (length=0)
      'sort_order' => string '50' (length=2)
      'status' => string '1' (length=1)
      'created_at' => string '1424857273' (length=10)
      'updated_at' => string '1424857273' (length=10)
      'created_by' => string '0' (length=1)
      'updated_by' => string '0' (length=1)
  6 => 
    array (size=15)
      'id' => string '7' (length=1)
      'parent_id' => string '2' (length=1)
      'name' => string '上網本' (length=9)
      'brief' => string '' (length=0)
      'is_nav' => string '0' (length=1)
      'banner' => string '' (length=0)
      'keywords' => string '' (length=0)
      'description' => string '' (length=0)
      'redirect_url' => string '' (length=0)
      'sort_order' => string '50' (length=2)
      'status' => string '1' (length=1)
      'created_at' => string '1424857318' (length=10)
      'updated_at' => string '1424857318' (length=10)
      'created_by' => string '0' (length=1)
      'updated_by' => string '0' (length=1)
  常規做法,比如上面的二維數組爲$rision
<?php
$rision=[
  0 => 
    array(
      'id' => '1',
      'parent_id' => '0',
      'name' => '手機' ,
      'brief' => 'mobile' ,
      'is_nav' => '1' ,
      'banner' => '' ,
      'keywords' => '' ,
      'description' => '' ,
      'redirect_url' => '' ,
      'sort_order' => '50' ,
      'status' => '1' ,
      'created_at' => '1422858315' ,
      'updated_at' => '1422858315' ,
      'created_by' => '0' ,
      'updated_by' => '0' 
      ),
  1 => 
    array (
      'id' => '2' ,
      'parent_id' => '0' ,
      'name' => '電腦' ,
      'brief' => 'computer' ,
      'is_nav' => '1' ,
      'banner' => '' ,
      'keywords' => '' ,
      'description' => '' ,
      'redirect_url' => '' ,
      'sort_order' => '50' ,
      'status' => '1' ,
      'created_at' => '1422858539' ,
      'updated_at' => '1422858539' ,
      'created_by' => '0' ,
      'updated_by' => '0' 
      ),
  2 => 
    array (
      'id' => '3' ,
      'parent_id' => '1' ,
      'name' => '蘋果' ,
      'brief' => 'iphone' ,
      'is_nav' => '1' ,
      'banner' => '' ,
      'keywords' => '' ,
      'description' => '' ,
      'redirect_url' => '' ,
      'sort_order' => '50' ,
      'status' => '1' ,
      'created_at' => '1422858566' ,
      'updated_at' => '1422858566' ,
      'created_by' => '0' ,
      'updated_by' => '0' 
      ),
  3 => 
    array (
      'id' => '4' ,
      'parent_id' => '1' ,
      'name' => '三星' ,
      'brief' => 'sansung' ,
      'is_nav' => '1' ,
      'banner' => '' ,
      'keywords' => '' ,
      'description' => '' ,
      'redirect_url' => '' ,
      'sort_order' => '50' ,
      'status' => '1' ,
      'created_at' => '1422858593' ,
      'updated_at' => '1422858593' ,
      'created_by' => '0' ,
      'updated_by' => '0' 
      ),
  4 => 
    array (
      'id' => '5' ,
      'parent_id' => '2' ,
      'name' => '臺式機' ,
      'brief' => '' ,
      'is_nav' => '0' ,
      'banner' => '' ,
      'keywords' => '' ,
      'description' => '臺式機電腦' ,
      'redirect_url' => '' ,
      'sort_order' => '50' ,
      'status' => '1' ,
      'created_at' => '1424857244' ,
      'updated_at' => '1424857244' ,
      'created_by' => '0' ,
      'updated_by' => '0' 
      ),
  5 => 
    array (
      'id' => '6' ,
      'parent_id' => '2' ,
      'name' => '筆記本' ,
      'brief' => '' ,
      'is_nav' => '0' ,
      'banner' => '' ,
      'keywords' => '' ,
      'description' => '筆記本電腦' ,
      'redirect_url' => '' ,
      'sort_order' => '50' ,
      'status' => '1' ,
      'created_at' => '1424857273' ,
      'updated_at' => '1424857273' ,
      'created_by' => '0' ,
      'updated_by' => '0' 
      ),
  6 => 
    array (
      'id' => '7' ,
      'parent_id' => '2' ,
      'name' => '上網本' ,
      'brief' => '' ,
      'is_nav' => '0' ,
      'banner' => '' ,
      'keywords' => '' ,
      'description' => '' ,
      'redirect_url' => '' ,
      'sort_order' => '50' ,
      'status' => '1' ,
      'created_at' => '1424857318' ,
      'updated_at' => '1424857318' ,
      'created_by' => '0' ,
      'updated_by' => '0' 
      )
      ];
      $grs = array('id','name');
      foreach($rision as $key=>$value)
      {
          for($i=0;$i<2;$i++)
          {
            $spse[$key][$i]=$value[$grs[$i]]; //爲了讓數組$spse[][],從$spse[1][1],開始,令$key=$key+1;                  
          }           
      }
      var_dump($spse);

輸出結果如下:

F:\wamp\www\test\array.php:138:
array (size=7)
  0 => 
    array (size=2)
      0 => string '1' (length=1)
      1 => string '手機' (length=6)
  1 => 
    array (size=2)
      0 => string '2' (length=1)
      1 => string '電腦' (length=6)
  2 => 
    array (size=2)
      0 => string '3' (length=1)
      1 => string '蘋果' (length=6)
  3 => 
    array (size=2)
      0 => string '4' (length=1)
      1 => string '三星' (length=6)
  4 => 
    array (size=2)
      0 => string '5' (length=1)
      1 => string '臺式機' (length=9)
  5 => 
    array (size=2)
      0 => string '6' (length=1)
      1 => string '筆記本' (length=9)
  6 => 
    array (size=2)
      0 => string '7' (length=1)
      1 => string '上網本' (length=9)

2、這是一般寫法,接下來我們介紹一種高逼格的寫法,其實他是PHP中的內置函數,寫法很簡單,數組不變,這裏不貼了,複製上面的即可

程序如下:

function getValue($array, $key, $default = null){
     if (is_array($array) && array_key_exists($key,$array)) {
            return $array[$key];
        }
      }
      foreach ($rision as $element) {
      $id = getValue($element,'id');
      $name = getValue($element,'name');
      var_dump($id.$name);
      }

程序運行結果如下:

F:\wamp\www\test\array.php:147:string '1手機' (length=7)
F:\wamp\www\test\array.php:147:string '2電腦' (length=7)
F:\wamp\www\test\array.php:147:string '3蘋果' (length=7)
F:\wamp\www\test\array.php:147:string '4三星' (length=7)
F:\wamp\www\test\array.php:147:string '5臺式機' (length=10)
F:\wamp\www\test\array.php:147:string '6筆記本' (length=10)
F:\wamp\www\test\array.php:147:string '7上網本' (length=10)

3、假如我們要id作爲鍵、name作爲值,此處恰巧id是數字,所以有很多便捷的方法,我們考慮id不是數字的情況,下面介紹一種通用的用法

程序如下:

$result[$id] = $name;

然後輸出結果如下:

array (size=7)
  1 => string '手機' (length=6)
  2 => string '電腦' (length=6)
  3 => string '蘋果' (length=6)
  4 => string '三星' (length=6)
  5 => string '臺式機' (length=9)
  6 => string '筆記本' (length=9)
  7 => string '上網本' (length=9)

上面我們只介紹了數組的檢索方式,關於對象其原理是一樣的,這裏就不詳細解釋了,下面會貼出源碼的,接下來我們就要封裝我們的方法了。在整個框架中,有些方法是常用的,所以我們可以使得這些方法變爲靜態方法,然後直接訪問。

public static function getValue($array, $key, $default = null)
    {
        if ($key instanceof \Closure) {
            return $key($array, $default);
        }

        if (is_array($array) && array_key_exists($key, $array)) {
            var_dump($array[$key]);
            return $array[$key];
        }

        if (($pos = strrpos($key, '.')) !== false) {
            $array = static::getValue($array, substr($key, 0, $pos), $default);
            $key = substr($key, $pos + 1);
        }

        if (is_object($array)) {
            return $array->$key;
        } elseif (is_array($array)) {
            return array_key_exists($key, $array) ? $array[$key] : $default;
        } else {
            return $default;
        }
    }
     public static function getColumn($array, $name, $keepKeys = true)
    {
        $result = [];
        if ($keepKeys) {
            foreach ($array as $k => $element) {
                $result[$k] = static::getValue($element, $name);
            }
        } else {
            foreach ($array as $element) {
                $result[] = static::getValue($element, $name);
            }
        }

        return $result;
    }

//將上面的方法些到一個類總,然後就可以像下面一樣調用了
類名::map($rision, 'id', 'name');

通往成功的方法有很多,如何高效、快速、準確地通往纔是我們值得思考的問題,有的人工作了很多年,但是他寫程序實現的方法依然很low,技術就是一點一滴積攢起來的,寫出與衆不同的代碼,寫出高質量的代碼,寫出BAT大咖們的代碼,加油吧,勝利就在前方!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章