如何在多维$ _SESSION数组中查找特定值?

时间:2014-08-28 05:24:15

标签: php arrays session

我使用$_SESSION数组来存储购物车中商品的商品描述,数量和价格。这一切都很有用,这是代码的开头部分:

$quantity = 1;

// add first item from shop page
if(isset($_POST['add_item']) && (!isset($_SESSION['cart']))) {
    $_SESSION['cart'] = array();
    $_SESSION['cart'][$_POST['product_description']] = array('quantity' => $quantity, 'price' => $_POST['product_price']);
    header("Location: http://website.com/cart.php");
    }

这会在$_SESSION['cart']数组中加载相应的信息,当我foreach将其循环到购物车页面时,我会得到购物车的确切内容。所有这些都可以按预期工作。

所以我现在要做的是搜索$_SESSION['cart']数组以确定特定项是否在$_SESSION['cart']数组中,例如“iPhone case - Black”。

我尝试了各种形式的echo $_SESSION['cart']['product_description']并且什么都没得到。当我print_r数组时,我得到了这个:

Array
(
    [iPhone case - Black] => Array
        (
            [quantity] => 1
            [price] => 9.49
        )

)

哪个是对的。执行var_dump会产生预期结果:

array(1) {
  ["iPhone case - Black"]=>
  array(2) {
    ["quantity"]=>
    int(1)
    ["price"]=>
    string(4) "9.49"
  }

}

当然,如果有更好的方法来构建数组,我愿意接受它。

我想要做的就是找出“iPhone case - Black”是否在$_SESSION['cart']数组中,并根据结果提供相应的代码。

我尝试了if (in_array('iPhone case - Black', $_SESSION['cart']))但没有产生任何结果,当我将其扩展为if (in_array('iPhone case - Black', $_SESSION['cart'][0]))...[1]...['product_description']时,我收到了错误消息:

Warning: in_array() expects parameter 2 to be array, null given in...

我错过了什么,只是让我检查$_SESSION['cart']数组来找到值,“iPhone案例 - 黑色”?我唯一的选择是foreach循环吗?

提前多多诚挚的谢意!

UPDATE 根据@rmmoul的要求发布代码:

// add first item from shop page
if(isset($_POST['add_item']) && (!isset($_SESSION['cart']))) {
$_SESSION['cart'][] = array('product_description'=> $_POST['product_description'], 'quantity' => $quantity, 'price' => $_POST['product_price']);
header("Location: http://website.com/cart.php");
}

通过print_r

返回此信息
Array
(
    [0] => Array
        (
            [product_description] => iPhone case - Black
            [quantity] => 1
            [price] => 9.49
        )

    [1] => Array
        (
        [product_description] => iPhone case - Black
        [quantity] => 1
        [price] => 9.49
    )

)

3 个答案:

答案 0 :(得分:2)

由于您使用$_POST['product_description']作为密钥,因此指定的值将成为关键,即'iPhone case - Black'

试试这个:

 if (isset($_SESSION['cart']['iPhone case - Black'])){

foreach($_SESSION['cart']['iPhone case - Black'] as $key=>$value){

echo $key."  ".$value."<br>";

}

答案 1 :(得分:1)

isset怎么样?

if ( isset( $_SESSION['cart']['iPhone case - Black'] ) )

如果是true,那么$_SESSION['cart']['iPhone case - Black']将包含信息:

array(2) {
    ["quantity"]=>
    int(1)
    ["price"]=>
    string(4) "9.49"
}

答案 2 :(得分:1)

您没有将值放入名为“product_description”的密钥中,而是在产品说明后命名密钥。尝试更改此行:

 $_SESSION['cart'][$_POST['product_description']] = array('quantity' => $quantity, 'price' => $_POST['product_price']);

要:

 $_SESSION['cart'][] = array('product_description'=> $_POST['product_description'], 'quantity' => $quantity, 'price' => $_POST['product_price']);

然后您将能够回显像:

这样的值
echo $_SESSION['cart'][0]['quantity'];
echo $_SESSION['cart'][0]['price'];
echo $_SESSION['cart'][0]['price'];

这也应该让你轻松拥有多个产品,如$ _SESSION ['cart'] [0],$ _SESSION ['cart'] [1]等。

然后,您可以遍历购物车数组以检查某些项目,如下所示:

foreach($_SESSION['cart'] as $product)
{
    if($product['product_description'] == 'black iphone')
    {
        //do something here
        echo $product['price'];
    }
}

虽然这是未经测试的,并且是从内存中编写的,所以可能需要稍微调整才能让它运行,但是它有一个应该对你有用的要点。

编辑:

我更新了foreach更有用。