减少阵列深度

时间:2012-07-19 14:10:29

标签: php arrays

我有一个来自键值表的数组,看起来像这样(直接来自数据库):

$application_strings = array(
    array('key' => 'building_type', 'value' => 'Building Type'),
    array('key' => 'application', 'value' => 'Application'),
);
/* would print_r like so:
Array(
    [0] => Array([key] => 'building_type', [value] => 'Building Type'),
    [1] => Array([key] => 'application', [value] => 'Application')
)
*/

并希望将其转换为类似

的内容
$strings = array(
    'building_type' => 'Building type',
    'application' => 'Application',);
/* would print_r like so:
Array(
    [building_type] => 'Building Type',
    [application] => 'Application'
)
*/

我目前的做法如下:

$strings_statement = DB::getDB()->prepare(
    "SELECT `key`, `value` FROM `strings` 
     WHERE `lang` = (SELECT `lang` FROM `sites` WHERE `key`=:key)");
$strings_statement->execute(array(':key' => 12345));
$application_strings = $strings_statement->fetchAll(PDO::FETCH_ASSOC);
$strings = array();
foreach($application_strings as $string) {
    $strings[$string['key']] = $string['value'];
}

这可以更短/更好吗?

4 个答案:

答案 0 :(得分:1)

$application_strings = array(
  array('key' => 'building_type', 'value' => 'Building Type'),
  array('key' => 'application', 'value' => 'Application'),
);

$output = array();
array_map(function($x) use (&$output) {
     $output[$x['key']] = $x['value']; 
}, array_values($application_strings));

如果你不想要一个循环,我想出的解决方案就像Daniel的回答一样。

答案 1 :(得分:1)

添加其他答案,因为第一个使用array_map来转换当前数组,但这不是仅仅转换数组(我没有第一次捕获它),是转换/合并某种数组,进入某种“对象”。

因此,array_map不是更快,走进数组的更快的函数是array_walk:

$application_strings = array(
    array('key' => 'building_type', 'value' => 'Building Type'),
    array('key' => 'application', 'value' => 'Application'),
);
$strings = array();
array_walk ($application_strings, function ($row) use(&$strings) {
  $strings[ $row['key'] ] = $row['value'] ;
}, $strings);
echo '<pre>';
print_r( $strings );
echo '</pre>';

输出:

Array
(
    [building_type] => Building Type
    [application] => Application
)

答案 2 :(得分:1)

自PHP5.5起,解决方案为array_column

$application_strings = [
    [
        'key' => 'building_type',
        'value' => 'Building Type'
    ],
    [
        'key' => 'application',
        'value' => 'Application'
    ],
];  
$output = array_column($application_strings, 'value', 'key');
print_r($output);

给出:

Array
(
    [building_type] => Building Type
    [application] => Application
)

答案 3 :(得分:0)

这是一个数组地图,试试这个:

$application_strings = array(
    array('key' => 'building_type', 'value' => 'Building Type'),
    array('key' => 'application', 'value' => 'Application'),
);
function transform($row){
  return array( $row['key'] => $row['value'] );
}
$strings = array_map ('transform', $application_strings);
echo '<pre>';
print_r( $strings );
echo '</pre>';

这给出了

Array(
    [0] => Array([building_type] => 'Building type'),
    [1] => Array([application] => 'Application')
)