给定键或属性名称检索数组元素或对象属性的值

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大咖们的代码,加油吧,胜利就在前方!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值