我正在创建一个PostgreSQL表列管理工具,以快速添加,删除和重新排列表中的列。到目前为止,它在简单的场景中工作得很好,我只是将一列附加到末尾或删除现有列。我的每个if
条件都调用其他函数来附加新列、删除现有列或重建整个表;据我目前测试,这些功能运行良好。
如何创建一个if
条件,在该条件中我将调用追加函数和删除函数而不是重建函数?
有几个数组可以帮助我确定逻辑,尽管我在解决它时遇到了麻烦。这是列名的数组,在这种情况下,我不应该调用重建函数,需要调用追加函数和删除函数。
在这种情况下,我要做的只是删除列id_2
并添加列id_4
这样就不需要重新排列顺序或列。
$columns_db - PostgreSQL 数据库中存在的列。
Array
(
[0] => id
[1] => id_1
[2] => id_2
[3] => id_3
)
$columns_updated - 我们将保留的数据库中的列。
Array
(
[0] => id
[1] => id_2
[2] => id_3
)
$columns_submit - 完成所有操作后列的最终显示方式,
Array
(
[0] => id
[1] => id_2
[2] => id_3
[3] => id_4
)
$columns_切片
$columns_slice = array_slice($columns_submitted,0,(count($columns_updated) - 1),true);
Array
(
[0] => id
[1] => id_2
)
$columns_remove - 将删除的列。
Array
(
[1] => id_1
)
$columns_append - 将创建的列。
Array
(
[id_4] => bigint
)
- 首先执行列删除
- 删除后
implode
列列表 ($before = implode($columns_updated);
) - 添加后
implode
列列表 ($after = implode($columns_submitted)
) -
if (strpos($after, $before) === 0) { /* the additions are at the end */ }
请确保使用 ===
运算符。
作为单行:
$rebuild = (strpos(implode($columns_submitted), implode($columns_updated)) !== 0);
我通常更喜欢直接if
/else if
条件,尽管它似乎太复杂而无法维护。 @AbraCadaver很明智地将我改编的添加/删除检测分开(如果不删除,就会投赞成票)。我已经测试了大约十几种棘手的组合,但未能找到任何误报。以下是我用来帮助可视化逻辑的调试版本:
$rebuild = 0;
foreach ($columns_append as $k1 => $v1)
{
//echo '<div class="clear">k1 = '.$k1.'</div>';
if (in_array($k1,$columns_slice)) {$rebuild = 1; break;}
else
{
$columns_submitted_key = array_search($k1,$columns_submitted);
//echo '<div class="clear">columns_submitted_key: '.$columns_submitted_key.', $columns_updated count = '.count($columns_updated).'</div>';
if ($columns_submitted_key<count($columns_updated)) {$rebuild = 1; break;}//echo '<div class="error">Yeah, rebuild here.</div>';
}
}
if ($rebuild>0) {echo '<div class="clear">1, rebuild.</div>';}
else
{
if (count($columns_append)>0) {echo '<div class="clear">2,append</div>';}
if (count($columns_remove)>0) {echo '<div class="clear">3,delete</div>';}
}