each()已弃用,难以摆脱

时间:2018-10-20 17:33:09

标签: php foreach each php-7.2

在一部分代码中,我正在使用sql数据库备份脚本:

if (!isset($table_select))
{
$result = $dbc->prepare("show tables");
$i=0;
$table="";
$tables = $dbc->executeGetRows($result);
foreach ($tables as $table_array)
{
list(,$table) = each($table_array);
$exclude_this_table = isset($table_exclude)? in_array($table,$table_exclude) : false;
if(!$exclude_this_table) $table_select[$i]=$table;
$i++;
}
}

我不知道如何摆脱这一部分:list(,$table) = each($table_array);

不推荐使用each(),有人知道解决方案吗?
非常感谢!

2 个答案:

答案 0 :(得分:1)

由于您没有使用each提供的密钥,因此在这种情况下不需要。

示例:https://3v4l.org/8vie4

由于数组是按拷贝而不是按引用传递的,因此,如果在相同的上下文中不再使用array_shift(),则可以使用$table_array作为替代。

foreach ($tables as $table_array) {
    $table = array_shift($table_array);
    var_dump($table);
}

请记住,array_shift会检索当前值,并将其从数组中删除。

由于each()检索当前键值对并将指针前进到下一个值,因此可以将其替换为current()next()

foreach ($tables as $table_array) {
    $table = current($table_array);
    var_dump($table);
    next($table_array);
}

如果在使用keycurrent时确实需要当前值的next,则可以使用key()

foreach ($tables as $table_array) {
    $key = key($table_array);
    $table = current($table_array);
    var_dump($key, $table);
    next($table_array);
}

由于您使用的自动备份脚本利用了PDO,因此可以通过使用fetchAll(PDO::FETCH_COLUMN);而不是executeGetRows来降低复杂度,这将检索0索引列的平面数组,而不是列键值对。

$result = $dbc->prepare("show tables");
$result->execute();
$i=0;
$table="";
$tables = $result->fetchAll(\PDO::FETCH_COLUMN);
foreach ($tables as $table) {
     //...
}

答案 1 :(得分:0)

您不想在php脚本中执行此操作。我强烈建议您尽可能使用一些cronjob。

您可以使用

创建一个cronjob
crontab -e

并添加如下内容:

0 1 * * * mysqldump -e --user=username --password='password' dbname | gzip | uuencode
sql_backup.gz | mail example@example.com

上面的示例每天都会在凌晨01点启动工作。

您可以在此处签出manual

希望有帮助! :)