我有一个会给数组添加id的会话,问题是即使id已经存在,每个id都会被添加。如何防止将重复的ID添加到数组中?
我想我需要使用in_array检查id,但我不确切知道如何正确使用它。
我使用以下链接将产品的ID发送到我的报价页面:
<p><a class="offertelink" href="offerte.php?product='.$productcr[0]['id'].'">Request a quote</a></p>
然后在该页面上我使用以下代码:
if(!isset($_SESSION['product'])){
$_SESSION['product'] = array();
}
// CHECK FIRST THAT $_GET['product'] IS SET BEFORE ADDING IT TO SESSION
if( isset($_GET['product'])){
$_SESSION['product'][] = $_GET['product'];
}
$prods = implode(",", $_SESSION['product']);
最后使用数组中的ID加载所有产品:
if(count($_SESSION['product']) != 0){
// offerte overzicht
$offerte = "SELECT * FROM `snm_content` WHERE `id` in (".$conn->real_escape_string($prods).") AND state = 1";
$offertecon = $conn->query($offerte);
$offertecr = array();
while ($offertecr[] = $offertecon->fetch_array());
}
但是现在每次我重新加载页面时,id都会再次添加,因为产品只加载了一次,所以并不是很糟糕,但我仍然想解决这个问题,因为我认为检查大量重复ID的查询是不是最好的方式。
答案 0 :(得分:2)
使用in_array
很简单 - 您只需检查element is in array
:
var_dump(in_array($element, $array));
在你的情况下是:
var_dump(in_array($_GET['product'], $_SESSION['product']));
支票是:
// i advise you to check product value as `int`.
// Because values as `empty string` or `0` or `false` are considered set
if( 0 < intval($_GET['product']) && !in_array($_GET['product'], $_SESSION['product']) ) {
$_SESSION['product'][] = $_GET['product'];
}
但更聪明的解决方案是将产品ID用作具有固定值的数组键(例如1
或true
):
$_SESSION['product'] = [
'101' => 1,
'102' => 1,
'106' => 1,
];
在这种情况下,您甚至不需要检查您的密钥是否存在 - 如果存在,它将被覆盖,如果不存在 - 将被添加:
if( 0 < intval($_GET['product']) ) {
$_SESSION['product'][ $_GET['product'] ] = 1;
}
// but here you need to take array keys instead of values
$prods = implode(",", array_keys($_SESSION['product']));
答案 1 :(得分:1)
选项1
使用in_array()
来防止重复:
// CHECK FIRST THAT $_GET['product'] IS SET BEFORE ADDING IT TO SESSION
if( isset($_GET['product'])){
if(!in_array($_GET['product'], $_SESSION['product']){
// product not exists in array
$_SESSION['product'][] = $_GET['product'];
}
}
选项2 添加产品前的空数组
//if(!isset($_SESSION['product'])){
$_SESSION['product'] = array();
//}