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