0

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

$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

4 回答 4

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

如果您不想要循环,我想出的解决方案是类似于丹尼尔的回答。

于 2012-07-19T14:34:29.990 回答
1

添加其他答案,因为第一个使用 array_map 来转换当前数组,但这不仅仅是转换数组(我第一次没有抓住它),而是将某种数组转换/合并为某种“目的”。

所以,array_map 并不是越快,而是越快进入 Array 的函数就是 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
)
于 2012-07-19T15:22:42.750 回答
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
)
于 2017-03-12T21:45:01.403 回答
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')
)
于 2012-07-19T14:29:18.033 回答