在其元素之一上切片多维PHP数组
时间:2020-03-06 15:02:11 来源:igfitidea点击:
举例来说,我们刚刚查询了一个数据库,就收到了这个2D数组。
$results = array( array('id' => 1, 'name' => 'red' , 'spin' => 1), array('id' => 2, 'name' => 'green', 'spin' => -1), array('id' => 3, 'name' => 'blue' , 'spin' => .5) );
我经常发现自己这样写循环。
foreach($results as $result) $names[] = $result['name'];
我的问题是,是否存在一种无需使用循环即可获取此数组$ names的方法?使用回调函数算作使用循环。
这是获取每个字段的更通用的示例。
foreach($results as $result) foreach($result as $key => $value) $fields[$key][] = $value;
解决方案
简而言之,不。
我们将需要使用循环或者诸如array_walk之类的回调函数。
我投票赞成@Devon的回答,因为实际上没有一种方法可以使用内置函数来完成我们要问的事情。我们能做的最好的就是编写自己的:
function array_column($array, $column) { $ret = array(); foreach ($array as $row) $ret[] = $row[$column]; return $ret; }
我想这会做你想要的
array_uintersect_uassoc
你将不得不做这样的事情
$results = array( array('id' => 1, 'name' => 'red' , 'spin' => 1), array('id' => 2, 'name' => 'green', 'spin' => -1), array('id' => 3, 'name' => 'blue' , 'spin' => .5) ); $name = array_uintersect_uassoc( $results, array('name' => 'value') , 0, "cmpKey"); print_r($name); ////////////////////////////////////////////////// // FUNCTIONS ////////////////////////////////////////////////// function cmpKey($key1, $key2) { if ($key1 == $key2) { return 0; } else { return -1; } }
但是,我没有访问PHP5的权限,所以我没有对此进行测试。
我对此进行了更多研究,发现ruby和原型都具有执行此功能的函数,称为array_pluck,2. 有趣的是,array_map具有第二种用法,它使我们可以做我想在这里做的相反的事情。我还发现有人在编写一个PHP类来模仿数组的原型操作。
我将进行更多挖掘,如果找不到其他内容,我将处理一个补丁以提交到[email protected]邮件列表,看看它们是否会添加array_pluck。