php:最简单的方法将索引的二维数组转换为关联索引的包含值的二维数组?

时间:2011-01-24 04:16:23

标签: php indexing multidimensional-array

我不断发现自己在数据库上运行查询并获得表示行的多维数组。不幸的是,第一级索引是数字的,这不是很有用。我经常在表中使用带有标识字符串的表,并希望将生成的多维数组转换为由该标识列关联索引的内容。

一个不起眼的自创自定义功能,可以做我想要的事情:

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');

...会在问题的顶部找到第一个数组。

2 个答案:

答案 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参数)。