PHP if 条件,用于添加和删除而不完全重建


PHP if condition for adding and removing without completely rebuilding

我正在创建一个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
)
  1. 首先执行列删除
  2. 删除后implode列列表 ( $before = implode($columns_updated);
  3. 添加后implode列列表 ( $after = implode($columns_submitted)
  4. 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>';}
}