我很惊讶还没有答案……这表明我在做一些根本错误的事情。或者其他人都是。
假设我有一个可能重复的值数组,这些值在客户端作为 POST 请求进入,目标是从 MySQL 返回一个由这些值索引的结果集,并且与这些值的顺序相同,并保留冗余!!!
因此,如果值为:1,2,3,2,3,4,5,5,5
期望的结果是:
+----+-------+
| id | value |
+----+-------+
| 1 | one |
| 2 | two |
| 3 | three |
| 2 | two |
| 3 | three |
| 4 | four |
| 5 | five |
| 5 | five |
| 5 | five |
+----+-------+
下面的代码似乎有效,但天哪,认真的吗?我必须滥用array_intersect()
并且有两个不同的循环,其中一个是嵌套的,只是为了使一个简单的结果集得到排序并以与输入数组相同的模式重复?这不可能是真正应该做到的。
function repQuery($inids,$incol,$querystring,$emptyval = "NULL"){
# incol is the name of a column in the query
# inids is an array within which the value of incol must be found
# querystring is a query of the form...
# "select FOO from BAR where %s in (%s) BLAH BLAH BLAH"
# The first %s will be replaced by $incol and the second by $inids
$qq = mysql_query(sprintf($querystring,$incol,implode(",",$inids))) or die(mysql_error());
$nf = mysql_num_fields($qq); $dummyrow = array();
for($ii = 0; $ii < $nf; $ii+= 1){
$dummyrow[mysql_field_name($qq,$ii)] = $emptyval;
};
$out = array_fill(0,count($inids),$dummyrow);
while($rr = mysql_fetch_assoc($qq)){
foreach(array_keys(array_intersect($inids,array($rr[$incol]))) as $ii) {
$out[(int)$ii] = $rr;
}
}
return $out;
}
我的问题是:是否有一些可接受的模式或 PHP 数组命令或其他我忽略的东西?在R
上面将是一个单行。