我不断发现自己在数据库上运行查询并获得表示行的多维数组。不幸的是,第一级索引是数字的,这不是很有用。我经常在表中使用带有标识字符串的表,并希望将生成的多维数组转换为由该标识列关联索引的内容。
一个不起眼的自创自定义功能,可以做我想要的事情:
function identity_associate($data, $identity_column='identity'){
$res = array();
foreach($data as $single_row){
$loop_identity = $single_row[$identity_column];
$res[$loop_identity] = $single_row;
}
return $res;
}
显然我每次都可以使用foreach循环,或者每当我将数据传递给它时使用该函数为我做这个,但是如果有一个内置的方法可以做到这一点本机的PHP函数,我宁愿使用它来进行修正。我试图在php文档中找到适合排序和数组的东西,但找不到任何确切的东西,谷歌也没什么帮助。任何人都知道php本地或其他更简单的东西?
即。我想转换查询数据库时得到的数据......
array(
array(
'user_id'=>45,
'identity'=>'bob',
'name'=>'Bob'
),
array(
'user_id'=>51,
'identity'=>'tchalvak',
'name'=>'TchalVak'
)
);
更有用的东西
array(
'bob'=>array(
'user_id'=>45,
'identity'=>'bob',
'name'=>'Bob'
),
'tchalvak'=>array(
'user_id'=>51,
'identity'=>'tchalvak',
'name'=>'TchalVak'
)
);
尽可能地优化,因为它是我一直在任何地方使用的东西。
修改
我想指出的是,我通过调用PDO中的内置函数从数据库中获取该格式的数据,并返回相当于第一个数组的数据:
$statement->execute();
return $statement->fetchAll(PDO::FETCH_ASSOC);
E.g。调用下面的sql:
$data = query('select name, user_id, identity from users order by identity');
...会在问题的顶部找到第一个数组。
答案 0 :(得分:1)
我正在考虑通过应用array_unshift()
函数的数组映射来关闭第一个元素,然后将array_map()
返回的数组与array_combine()
的原始数组配对。这是一个示例,请记住,只有当identity元素是子数组的第一个元素时它才会起作用:
<?php
$arrs = array(
array(
'identity'=>'bob',
'user_id'=>45,
'name'=>'Bob'
),
array(
'identity'=>'tchalvak',
'user_id'=>51,
'name'=>'TchalVak'
)
);
$identites = array_map( 'array_shift', $arrs );
$formatted = array_combine( $identites, $arrs );
print_r( $formatted );
?>
如果身份不是第一个元素,如果有必要,您可以制作一个辅助函数来传递给数组映射。
<?php
$arrs = array(
array(
'identity'=>'bob',
'user_id'=>45,
'name'=>'Bob'
),
array(
'identity'=>'tchalvak',
'user_id'=>51,
'name'=>'TchalVak'
)
);
$identites = array_map( 'array_grab', $arrs );
$formatted = array_combine( $identites, $arrs );
print_r( $formatted );
function array_grab( $array ) { return( $array['identity'] ); }
?>
答案 1 :(得分:0)
我相信你的数组也是定制的,也有内置于PHP的内容。您可以使用array_map并保存在foreach上,但这并没有真正节省太多(并且消除了$identify_column
参数)。