2012-07-19 74 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