首页 > 解决方案 > 如果 PHP 中存在数组,则跳过添加到数组

问题描述

我正在使用in_array函数跳过将相同的地址添加到数组中。

代码:

$addresses_list = array();
$stmt_select_address_result = $databaseManager->connect()->prepare("SELECT lat,lng,address FROM api_order where userid=683;");
$stmt_select_address_result->execute();

while ($row = $stmt_select_address_result->fetch(PDO::FETCH_ASSOC)) {
    if (!in_array($row, $addresses_list)) {
        array_push($addresses_list, $row);
    }
}

$row['address']如果与 的地址相同,我想跳过添加到数组中$addresses_list['address']

标签: phparrays

解决方案


您可以创建一个临时变量来存储address已存储在$addresses_list数组中的值。每当您将 a 存储$row$addresses_list数组中时,您都可以将address键值存储在临时变量中。

现在,每次您需要检查临时变量时,键值是否已经存在。

请注意,即使是PHP 文档也建议[]array_push(). 所以我改变了你的代码来[]代替使用。

注意:如果使用 array_push() 向数组添加一个元素,最好使用 $array[] = 因为这样就没有调用函数的开销。

试试下面(评论中的解释):

$addresses_list = array();
$temp_addresses = array(); // Create a temp array

$stmt_select_address_result = $databaseManager->connect()->prepare("SELECT lat,lng,address FROM api_order where userid=683;");
$stmt_select_address_result->execute();

while ($row = $stmt_select_address_result->fetch(PDO::FETCH_ASSOC)) {

    // check in temporary variable instead
    if (!in_array($row['address'], $temp_addresses)) {

        // add to temp array to avoid duplicate entry in next loop
        $temp_addresses[] = $row['address'];

        $addresses_list[] = $row;
    }
}

如果您真的只想要唯一的地址值,并且重复行没有其他用途。您可以在 SQL 查询端本身解决这个问题。您可以简单地使用GROUP BYon address。这将优化从数据库服务器传输到 PHP 应用程序的数据包。此外,可以通过其他方式完成额外的数组操作。

$addresses_list = array();

// It is a good practice to have query string in a separate variable
$sql = "SELECT lat,lng,address 
        FROM api_order 
        where userid=683 
        GROUP BY address;"

$stmt_select_address_result = $databaseManager->connect()->prepare($sql);

$stmt_select_address_result->execute();

while ($row = $stmt_select_address_result->fetch(PDO::FETCH_ASSOC)) {
    // No need for any checks, as you are getting unique addresses only        
    $addresses_list[] = $row;
}

推荐阅读