我绝不会要求任何人重新编写我的代码,而是找到可以改进代码的地方,或者实现更好的实践。这就是函数简单工作的方式。
函数$Class->getTaxClass()
接受至少1个参数,可以是单个ID,也可以是ID的数组。它也可以接受它想要抓取的特定行的值,如$Class->getTaxClass($array, 'name','tid')
所以我真的只是在寻找改进函数代码结构/最佳实践/逻辑的方法,具体如下:
public function getTaxClass()
{
$arg = func_get_args();
$or = 'pa.pid = ?';
if(is_array($arg[0]))
{
$i = 1;
while($i < count($arg[0]))
{
$or .= " OR pa.pid = ?";
$i ++;
}
}
if(count($arg) == 1)
{
$pid = $arg[0];
$row = "a.*";
}
else if(count($arg > 1))
{
$pid = array_shift($arg);
$prepared_args = array();
foreach($arg as $a) {
$prepared_args[] = "a." . $a;
}
$row = implode(',', $prepared_args);
}
$stmt = _DB::init()->prepare("SELECT $row
FROM tax_class a
INNER JOIN products_to_tax_class pa
ON a.tid = pa.tid
WHERE ($or)"
);
if(is_array($arg[0]))
{
if($stmt->execute($arg[0]))
return $stmt->fetch(PDO::FETCH_ASSOC);
}
else
{
if($stmt->execute(array($pid)))
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}
非常感谢!
答案 0 :(得分:0)
我的建议:
public function getTaxClass() {
$args = func_get_args();
// columns to select:
$cols = array();
for ($i=1; $i<=count($args); $i++) {
$cols[] = "a.{$args[$i]}";
}
$cols = count($cols) ? join(',', $cols) : 'a.*';
// IDs to filter and their placeholders:
$ids = (array) $args[0];
$phs = join(',', array_fill(0, count($ids), '?'));
$stmt = _DB::init()->prepare(
"SELECT {$cols}
FROM tax_class a
INNER JOIN products_to_tax_class pa
ON a.tid = pa.tid
WHERE pa.pid IN ({$phs})"
);
if ($stmt->execute($ids)) {
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}
P.S。代码未经测试,可能仍会出现一些错误:)