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

时间:2017-08-02 10:39:01

标签: php session

我有一个元素显示客户最后查看的产品。它将产品ID存储在会话中,并在查询中使用这些ID来获取所有产品。问题是,有3个产品的限制,我可以在查询中添加LIMIT 0,3,但这并不限制会话中存储的ID数量。

我得到的一个例子:

在产品页面上:

$_SESSION['laatstbekeken'][] = $productcr[0]['id'];

在目录页面上:

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";

当回显时,查询看起来像这样:

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

4 个答案:

答案 0 :(得分:1)

如果您只想在$prods中使用最后三个ID,请使用array_slice()在此处进行检查http://php.net/manual/en/function.array-slice.php
 试试这个

if($_SESSION['laatstbekeken'] != ''){
  $prods  = implode(",", array_slice($_SESSION['laatstbekeken'],-3));
}
$laatst  = "SELECT * FROM `snm_content` WHERE id IN ($prods) and state = 1 ORDER BY hits DESC LIMIT 0,3";

要删除重复的产品ID ,请使用array_unique 这样做

 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";

<强> EDIT2: -

if($_SESSION['laatstbekeken'] != ''){
    $result = array_unique(array_reverse($_SESSION['laatstbekeken']));
    $result=array_reverse($result);
    $prods  = implode(",", array_slice($result,-3));
}

答案 1 :(得分:0)

一个函数,如果元素尚不存在,则向该元素添加元素。

我们假设如下:

  • $mArray是您的$_SESSION['laatstbekeken']
  • $currentProduct是您的$productcr[0]['id']

并且$mArray(1,2,3)内已有3个产品ID。您正在查看的当前产品为4,因此必须将其添加到array

$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;



}

输出:

Before : 
Array
(
    [0] => 3
    [1] => 2
    [2] => 1
)

After : 
Array
(
    [0] => 4
    [1] => 3
    [2] => 2
)

答案 2 :(得分:0)

更改您的代码如下:

在产品页面上:

if(count($_SESSION['laatstbekeken']) < 3 )
    $_SESSION['laatstbekeken'][] = $productcr[0]['id'];
else{
    array_pop($_SESSION['laatstbekeken']);
    $_SESSION['laatstbekeken'][] = $productcr[0]['id'];
}
print_r($_SESSION['laatstbekeken']);

在目录页面上:

if($_SESSION['laatstbekeken'] != '' && count($_SESSION['laatstbekeken']) == 3 ){
    echo $prods  = implode(",", $_SESSION['laatstbekeken']);
}

答案 3 :(得分:0)

插入新产品后,像这样切片数组: $_SESSION['laatstbekeken'] = array_slice($_SESSION['laatstbekeken'], -3, 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']);

输出将是:

/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)
}