Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 设置数组的限制并删除超过该限制的值_Php_Session - Fatal编程技术网

Php 设置数组的限制并删除超过该限制的值

Php 设置数组的限制并删除超过该限制的值,php,session,Php,Session,我得到了一个元素,它显示了客户最近查看的产品。它将产品ID存储在会话中,并在查询中使用这些ID来获取所有产品。问题是,有3个产品的限制,我可以在查询中添加limit 0,3,但这并不限制会话中存储的ID数量 我得到的一个例子: 在产品页面上: $_SESSION['laatstbekeken'][] = $productcr[0]['id']; if($_SESSION['laatstbekeken'] != '' && count($_SESSION['laatstbekek

我得到了一个元素,它显示了客户最近查看的产品。它将产品ID存储在会话中,并在查询中使用这些ID来获取所有产品。问题是,有3个产品的限制,我可以在查询中添加
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)中,因为它已经在数组中,所以不再添加它。我怎样才能解决这个问题?