2012-04-17 75 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