Удаление последнего слова из цикла FOREACH - PullRequest
4 голосов
/ 26 марта 2010

Я создаю базовую функцию, которая создает выражения Mysql WHERE на основе количества в массиве.

$array = array('id' => '3', 'name' => 'roger'); 
$sql = "SELECT * FROM table WHERE ";

foreach ($array as $k => $v) {
    $sql .= $k . ' = ' . $v . ' AND ';
}

, который выдаст

SELECT * FROM table WHERE id = 3 AND name = roger AND

Однако, очевидно, я не хочу этого последнего И, как мне удалить его из строки?

Спасибо

Ответы [ 5 ]

12 голосов
/ 26 марта 2010

Вы могли бы сделать

$sql = substr($sql, 0, -5);

Но, возможно, более элегантное решение -

$array = array('id' => '3', 'name' => 'roger'); 
$clauses = array();

foreach ($array as $k => $v)
    $clauses[] = $k . ' = ' . $v;

$sql = "SELECT * FROM table WHERE " . implode(' AND ', $clauses);
2 голосов
/ 26 марта 2010
$array = array('id' => '3', 'name' => 'roger'); 
$sql = "SELECT * FROM table WHERE ";

foreach ($array as $k => $v) {
    $sql .= $k . ' = ' . $v . ' AND ';
}

$sql = substr(trim($sql), 0, -3);
1 голос
/ 26 марта 2010

Я бы сделал это так:

$sql = "SELECT * FROM table WHERE 1=1 "; 
// add "AND x=y" for every pair of key, value pair in the array.    
foreach ($array as $k => $v) 
    $sql .= ' AND ' . $k . ' = ' . $v;

Я добавил 1=1 в предложение where, чтобы ваш запрос был действительным , даже если массив $array равен пуст .

0 голосов
/ 26 марта 2010

Переформулируйте вопрос. Вы пытаетесь поставить И после каждого предложения, кроме последнего. Было бы легче поставить AND перед каждым предложением, кроме первого.


$first = true;
foreach ($array as $k => v) {
    if (!$first) $sql .= ' AND ';
    $first = false;
    sql .= $k . ' = ' . $v;
}

Возможно, не самый простой способ в этом случае (другие люди упомянули использование substr). Тем не менее, я нашел, что это хороший инструмент для запоминания в подобных ситуациях.

0 голосов
/ 26 марта 2010

$sql = trim($sql, ' AND ');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...