我的数组看起来像:
$arr = array("a" => "b", "c" => "d", "e" => "f");
考虑最终的MySQL语句看起来像
SELECT
IF(field1 = 'a', 'b',
IF(field1 = 'c', 'd',
IF(field1 = 'e', 'f', default_value))) AS value FROM tbl;
我知道我必须做一个递归数组,但我不知道如何修改数组,以便它不会在无限循环中结束。我喜欢像以下一样调用它:
$if_stmt = generate_if($arr, "default_value");
如果没有其他逻辑测试等于true,则“default_value”是默认值。到目前为止我已经
了 function generate_if(&$arr, $default_value = "default_value"){
foreach($arr as $orig => $new){
}
}
并且不知道如何继续..任何帮助非常感谢。
答案 0 :(得分:1)
如果我理解你想要的东西:
丑陋的方式:
$ending = '';
$sql = 'SELECT ';
foreach ($arr as $orig => $new) {
$sql .= 'IF(field1 = ' . $orig . ', ' . $new . ',';
$ending .= ')';
}
$sql .= $default_value . $ending . ' AS value FROM tbl';
也许你可以告诉我们更多关于你想做什么的事情,因为我不确定你是否正朝着正确的方向前进。
答案 1 :(得分:1)
考虑到你的SQL是正确的:
function generate_if($arr, $default_value = "default_value") {
echo 'SELECT';
foreach($arr as $k => $v) {
echo ' IF(field1 = "', $k,'", "', $v,'", ';
}
echo $default_value,
str_repeat(')', count($arr)),
' AS value FROM tbl;';
}
我认为你可以避免使用引用。它们不会加快性能。
答案 2 :(得分:0)
我建议使用CASE
语句,而不是错综复杂的IF / ELSE:
$sql = 'SELECT CASE ';
for($array as $if => $then) {
$sql .= sprintf('WHEN field1 = \'%s\' THEN \'%s\' ',
mysqli_real_escape_string($if),
mysqli_real_escape_string($then));
}
$sql .= sprintf('ELSE \'%s\' END CASE AS value ',
mysql_real_escape_string($default_value));
$sql .= 'FROM table1';