2012-04-17 90 views
0

我知道那裏必須有一個簡單而有效的方法來做到這一點。PHP關聯陣列 - 替換 - >與「as」

我有一個這樣的數組:

 $fields = array("EVENT_ID" => "Event Id" , 
      "EVENT_NAME"   => "Name", 
      "EVENT_CLASSIFICATION" => "Classification", 
      "DESCRIPTION"   => "Description", 
      "START_TIME"   => "Start Time", 
      "END_TIME"    => "End Time" 
      ); 

我想將其轉換爲這個查詢:

   Select 
        "EVENT_ID" as "Event ID", 
        "EVENT_NAME" as "Name", 
        ... 
       from 
        ... 

不想把這個循環。 PHP有很多數組處理函數,這一定很容易。我是新來的PHP。

任何想法?

+9

抱歉讓你們失望,但是如果你害怕的循環,忘掉陣列:) – 2012-04-17 17:15:28

+0

除了一般的軟件開發外,也許還有Prolog,SQL和僅限功能的語言。 – 2012-04-17 17:25:48

+0

@AndrejsCainikovs,忘記陣列!?!什麼是更好的替代品? :-) – 2012-04-17 17:27:54

回答

0

您可以通過循環訪問您的值來簡單地構建查詢的字符串。

$query = ''; 
foreach($fields as $k => $v) 
    $query .= '"' . $k . '" as "' . $v . '",'; 
echo $query; 

請注意,這將留下尾隨逗號。如果你想刪除它,你可以使用

$query = rtrim($query, ','); 

Live example

5

我強烈建議循環!

$sel = array(); 
foreach($fields as $key => $val) { 
    $sel[] = '`'.$key.'` AS `'.$val.'`'; 
} 
$sel = implode(',', $sel); 
+0

請正確到$ sel [] = $ key。' AS'。$ val; – heximal 2012-04-17 17:15:13

+0

是的,謝謝,我輸入得太快了。 – 2012-04-17 17:16:05

+0

謝謝!不可能沒有循環? – 2012-04-17 17:21:57

3

一個循環(可能)是這裏的路,但你可以沒有一個。使用array_map

$sql = implode(',', array_map(function($v, $k){ 
    return "`$k` AS `$v`"; 
}, $fields, array_keys($fields))); 

注意,你只能在PHP 5.3+中傳遞這樣的函數。如果您使用的是5.2,則可以使用create_function

$sql = implode(',', array_map(create_function('$v, $k', 'return "`$k` AS `$v`";'), $fields, array_keys($fields))); 
+1

很酷的襯墊,+1 – 2012-04-17 17:23:30

+0

謝謝!看上去不錯。哪一個是高效和快速的?循環還是這個? – 2012-04-17 17:24:03

+2

@KevinRave函數就像'array_map()'無論如何都在引擎蓋下使用循環,不會有太多內容。也就是說,C++循環可能比PHP更有效,所以這可能稍微好一點。但差別很小,除非你有成千上萬的物品,否則它不會引起注意。雖然這確實增加了在下面的循環的每次迭代中調用函數的額外開銷,所以YMMV。 – DaveRandom 2012-04-17 17:26:35

2

如果你在5.3中,你可以使用array_reduce帶密封蓋(普通的舊職能的工作太多,但foreach會短於):

$sql = array_reduce(array_keys($fields), function(&$result, $key) use ($fields) { 
    if (!is_null($result)) $result .= ",\n"; 
    return "{$result}'{$key}' AS '{$fields[$key]}'"; 
}); 

Try online

+0

我更喜歡'array_map'這種情況,但是這也可以。 +1 – 2012-04-17 17:40:19