2012-07-19 72 views
0

我有看起来像这样的一个键值表的数组(从DB直来):减少阵列深入

$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']; 
} 

可以这样做短/更好?

+0

一个更好的解决方案是'SELECT'输出你想要的而不是重新安排PHP中的数据集。你能显示查询吗? – Martin 2012-07-19 14:16:58

+0

如果你用你的方法做'print_r($ strings,true)' - 你会得到什么? – ethrbunny 2012-07-19 14:23:34

+0

添加了上面的查询。如果我可以相应地修改查询,那就太好了。但是,由于我不太擅长SQL,因此我首先在PHP端进行了修改。 – fragmentedreality 2012-07-19 14:24:17

回答

0

由于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 
) 
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') 
) 
+0

这使得排序键和值正确,但给了我相同的嵌套级别。所以我马丁斯答案。 – fragmentedreality 2012-07-19 14:40:58

+0

你问简短或更好的方式来做到这一点。它并不短,但更好,循环用于迭代,array_map用于变换数组。 – 2012-07-19 14:42:22

+0

但它没有给出我想要的结果。看到我的问题上面我目前的做法和我需要的结果。 – fragmentedreality 2012-07-19 14:46:37

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

当时我想到了,如果你不想要一个循环的解决方案,类似于丹尼尔的回答。

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 
) 
+0

好的。非常感谢你。感谢您在接受另一个答案后再添加一个答案。我将在明天看到这一点,因为我很快就会放下锤子。 – fragmentedreality 2012-07-19 16:05:40

+0

我结束了两个类似的情况。在他们每个人中,你的答案之一更合适。所以我会保留第一个标记为接受的答案...... – fragmentedreality 2012-07-24 15:31:24