覆盖数组位置

时间:2013-07-16 13:28:02

标签: php arrays magento loops

我有点难以编写一个小方法来将产品ID及其关联的超级属性应用于数组会话。

我要做的是,如果某个属性集(例如背心)已经存在于数组中,那么它将不会添加到数组中,而是使用更新的id和super属性覆盖位置。我目前正在重写magento添加到购物车的方式,以便在捆绑中使用可选的可配置产品。

目前脚本采用ajax参数,然后将其应用于(在拆分一些冗余和不需要的数据之后)要保留的会话,直到调用add to cart方法。

我目前的代码库包含以下内容:

<?php
// Handler for holding onto package products.
umask(0);
require_once 'app/Mage.php';
Mage::app();
Mage::getSingleton('core/session', array ('name' => 'frontend'));
$product = $_POST['productAdd'];
$split = explode(",",$product);
$actual = $split[0] . ',' . $split[1] . ',' . $split[2];
$_product = Mage::getModel('catalog/product')->load($split[0]);
$attributeSet = Mage::getModel('eav/entity_attribute_set')->load($_product->getAttributeSetId())->getAttributeSetName();
if(!empty($_SESSION['products'])) {
$arrayLength = count($_SESSION['products']);
    for($i = 0; $i <= $arrayLength; $i++) {
        if(strstr($_SESSION['products'][$i], $attributeSet)) {
            $_SESSION['products'][$i] = $actual;
            break;
        }else{
            $_SESSION['products'][] = $actual;
        }   
    }
}else{
    $_SESSION['products'][] = $product;
}
var_dump($_SESSION['products']);
?>

这适用于数组中的第一次出现并正确覆盖索引​​位置,但是,对数组的任何后续添加都不会覆盖,而只是附加到数组的末尾,这不是我的意思之后!]

示例输出:

array(4) { 
   [0]=> string(19) "15302, 959, Jackets" 
   [1]=> string(21) "15321, 1033, Trousers" 
   [2]=> string(21) "15321, 1033, Trousers" 
   [3]=> string(21) "15321, 1033, Trousers" 
} 

如果有人能给我一个正确方向的推动,那将是非常感激的!

谢谢!

2 个答案:

答案 0 :(得分:0)

更改您的测试以检查

if(strstr($_SESSION['products'][$i], $attributeSet) !== FALSE) {
如果您搜索的字符串从第一个位置开始,

strstr可以返回0,这将使您之前的测试失败。

如果你的陈述的“然后”部分也是不必要的话,那就是休息。

答案 1 :(得分:0)

终于想通了,花了很多时间来解决这个问题,所以我希望将来可以帮助其他人:

umask(0);
require_once 'app/Mage.php';
Mage::app();
Mage::getSingleton('core/session', array ('name' => 'frontend'));
$product = $_POST['productAdd'];
$split = explode(",",$product);
$i = 0;
$actual = $split[0] . ',' . $split[1] . ',' . $split[2];
$_product = Mage::getModel('catalog/product')->load($split[0]);
$attributeSet = Mage::getModel('eav/entity_attribute_set')->load($_product->getAttributeSetId())->getAttributeSetName();
if(!empty($_SESSION['products'])) {
    foreach($_SESSION['products'] as $superAttribute) {
        $explode = explode(",",$superAttribute);
        $result = ltrim($explode[2],(' '));
        if($result == $attributeSet) {
            $foundItem = true;
            break;
        }
        $i++;
    }
    if($foundItem) {
        $_SESSION['products'][$i] = $actual;
    }else{
        $_SESSION['products'][] = $actual;
    }
}else{
    $_SESSION['products'][0] = $actual;
}

输出:

array(5) { 
   [0]=> string(18) "6085, 963, Jackets"
   [1]=> string(20) "6087, 1029, Trousers"
   [2]=> string(16) "3369, 1201, Hats"
   [3]=> string(23) "17510, 1327, Waistcoats"
   [4]=> string(24) "15028, 895, Dress Shirts"
} 

这正确地覆盖了所需索引处的数组,它确实有一些代码可以修剪掉第一个空白块(这就是ajax发送的内容)。对于实现此目的的其他人来说,这可能不是必需的,所以请记住这一点!