Php 设置数组的限制并删除超过该限制的值
我得到了一个元素,它显示了客户最近查看的产品。它将产品ID存储在会话中,并在查询中使用这些ID来获取所有产品。问题是,有3个产品的限制,我可以在查询中添加Php 设置数组的限制并删除超过该限制的值,php,session,Php,Session,我得到了一个元素,它显示了客户最近查看的产品。它将产品ID存储在会话中,并在查询中使用这些ID来获取所有产品。问题是,有3个产品的限制,我可以在查询中添加limit 0,3,但这并不限制会话中存储的ID数量 我得到的一个例子: 在产品页面上: $_SESSION['laatstbekeken'][] = $productcr[0]['id']; if($_SESSION['laatstbekeken'] != '' && count($_SESSION['laatstbekek
limit 0,3
,但这并不限制会话中存储的ID数量
我得到的一个例子:
在产品页面上:
$_SESSION['laatstbekeken'][] = $productcr[0]['id'];
if($_SESSION['laatstbekeken'] != '' && count($_SESSION['laatstbekeken']) == 3 ){
echo $prods = implode(",", $_SESSION['laatstbekeken']);
}
在目录页上:
if($_SESSION['laatstbekeken'] != ''){
$prods = implode(",", $_SESSION['laatstbekeken']);
}
$laatst = "SELECT * FROM `snm_content` WHERE id IN ($prods) and state = 1 ORDER BY hits DESC LIMIT 0,3";
<?php
$_SESSION['laatstbekeken'][] = 12;
$_SESSION['laatstbekeken'][] = 13;
$_SESSION['laatstbekeken'][] = 14;
var_dump($_SESSION['laatstbekeken']);
$_SESSION['laatstbekeken'][] = 15;
$_SESSION['laatstbekeken'][] = 16;
var_dump($_SESSION['laatstbekeken']);
$_SESSION['laatstbekeken'] = array_slice($_SESSION['laatstbekeken'], -3, 3);
var_dump($_SESSION['laatstbekeken']);
$_SESSION['laatstbekeken'][] = 17;
$_SESSION['laatstbekeken'][] = 18;
$_SESSION['laatstbekeken'] = array_slice($_SESSION['laatstbekeken'], -3, 3);
var_dump($_SESSION['laatstbekeken']);
然后,该查询在回显时如下所示:
SELECT * FROM `snm_content` WHERE id IN (7,6,5,7,8,5) and state = 1 ORDER BY hits DESC LIMIT 0,3
如何确保会话中始终只有3个ID
例如,当会话包含3,2,1且客户查看产品4时,会话应包含4,3,2一个函数,该函数在数组中添加一个元素(如果该元素尚不存在) 让我们假设以下情况:
是您的$mArray
$\u会话['laatstbekeken']
是您的$currentProduct
$productcr[0]['id']
$mArray(1,2,3)
中已经有3个产品id。您正在查看的当前产品是4
,因此必须将其添加到阵列中
$mArray = [3,2,1];
$currentProduct = 4;
echo "<pre>Before : <br/>";
print_r($mArray);
echo "<br/>After : <br/>";
$mArray = addProductToArray($currentProduct, $mArray);
print_r($mArray);
function addProductToArray($mCurrentProduct, $mArray){
if(sizeof($mArray) < 3){
if(!in_array($mCurrentProduct, $mArray)){
$mArray[] = $mCurrentProduct;
}
}
else{
if(!in_array($mCurrentProduct, $mArray)){
array_pop($mArray);
array_unshift($mArray, $mCurrentProduct);
}
}
return $mArray;
}
如果您只想在$prods
中使用最后三个ID,请使用array\u slice()
在此处进行检查
像这样试试
if($_SESSION['laatstbekeken'] != ''){
$result = array_unique($_SESSION['laatstbekeken']);
$prods = implode(",", array_slice($result,-3));
}
$laatst = "SELECT * FROM `snm_content` WHERE id IN ($prods) and state = 1 ORDER BY hits DESC LIMIT 0,3";
要删除重复的产品ID,请使用
你喜欢这样吗
if($_SESSION['laatstbekeken'] != ''){
$result = array_unique(array_reverse($_SESSION['laatstbekeken']));
$result=array_reverse($result);
$prods = implode(",", array_slice($result,-3));
}
Edit2:-
if(count($_SESSION['laatstbekeken']) < 3 )
$_SESSION['laatstbekeken'][] = $productcr[0]['id'];
else{
array_pop($_SESSION['laatstbekeken']);
$_SESSION['laatstbekeken'][] = $productcr[0]['id'];
}
print_r($_SESSION['laatstbekeken']);
按以下方式更改代码:
在产品页面上:
$_SESSION['laatstbekeken'][] = $productcr[0]['id'];
if($_SESSION['laatstbekeken'] != '' && count($_SESSION['laatstbekeken']) == 3 ){
echo $prods = implode(",", $_SESSION['laatstbekeken']);
}
插入新产品后,按如下方式切片阵列:
$\u会话['laatstbekeken']=array\u切片($\u会话['laatstbekeken'],-3,3)代码>
此示例有助于查看结果:
/sess.php:7:
array(3) {
[0] =>
int(12)
[1] =>
int(13)
[2] =>
int(14)
}
/sess.php:12:
array(5) {
[0] =>
int(12)
[1] =>
int(13)
[2] =>
int(14)
[3] =>
int(15)
[4] =>
int(16)
}
/sess.php:16:
array(3) {
[0] =>
int(14)
[1] =>
int(15)
[2] =>
int(16)
}
/sess.php:23:
array(3) {
[0] =>
int(16)
[1] =>
int(17)
[2] =>
int(18)
}
这是可行的,但是当一个用户查看一个产品3次时,当会话中已经有2个产品时,将有相同的产品3次,因此在列表中只显示1个产品。检查一个数字是否存在容易吗?好的,我只是更新同一个产品的答案,只要使用它就可以了。差不多了,但当我看三个产品,然后看第四个产品时,它就不再变化了。一个旧值不会被删除并保留在数组中,因此当我观看3个产品时,将不会添加在显示的3个产品之前已经观看的第4个产品。这是数组(id 7首先被观看)数组([0]=>7[1]=>8[2]=>5[4]=>6),并且即使7之后被观看,这也会显示在查询(8,5,6)中,因为它已经在数组中,所以不再添加它。我怎样才能解决这个问题?