2012-04-17 2 views
0

Я знаю, что должен быть простой и эффективный способ сделать это.PHP Ассоциативные массивы - Заменить -> с «как»

У меня есть массив как это:

 $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 
        ... 

Не хотите поставить это в Loop. PHP имеет множество функций обработки массивов, и это должно быть легко. Я новичок в php.

Любые идеи?

+9

Жаль разочаровать вас, но если вы боитесь петель, забыть о массивах :) –

+0

Помимо разработки программного обеспечения в целом, кроме, возможно, Prolog, SQL и функционально-ориентированных языков. –

+0

@ AndrejsCainikovs, Forget Array!!! Какие лучшие альтернативы? :-) –

ответ

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

+0

Да, спасибо, я набрал слишком быстро. –

+0

Спасибо! Невозможно без петель? –

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 –

+0

Спасибо! Выглядит хорошо. Какой из них эффективный и быстрый? Петля или эта? –

+2

@KevinRave функции, такие как 'array_map()' использовать петли под капотом в любом случае, там не будет много. Тем не менее, цикл C++, вероятно, более эффективен, чем PHP, поэтому это, вероятно, немного лучше. Но так мало различий, что это даже не заметно, если у вас нет сотен тысяч предметов. Хотя у этого есть дополнительные накладные расходы на вызов функции на каждой итерации цикла под этим, поэтому YMMV. – DaveRandom

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 –

Смежные вопросы