无法修改函数内的数组

时间:2013-10-16 09:38:37

标签: php arrays pass-by-reference pass-by-value

protected function _changeArray(&$Products)
    {
        foreach($Products as $item)
        {
            Mage::log('Type: '.$item['attribute']);

            switch($item['shipping_attribute'])
            {
                case '0':
                    $item['is_cargo'] = 'no';
                    $item['is_bulky'] = 'no';
                    $item['is_firework'] = 'no';
                    Mage::log('assigned '.$item['attribute']);
                    break;
                case '1':
                    $item['is_cargo'] = 'yes';
                    $item['is_bulky'] = 'no';
                    $item['is_firework'] = 'no';
                    Mage::log('assigned '.$item['attribute']);
                    break;
                case '2':
                    $item['is_cargo'] = 'no';
                    $item['is_bulky'] = 'yes';
                    $item['is_firework'] = 'no';
                    Mage::log('assigned '.$item['attribute']);
                    break;
                case '3':
                    $item['is_cargo'] = 'no';
                    $item['is_bulky'] = 'no';
                    $item['is_firework'] = 'yes';
                    Mage::log('assigned '.$item['attribute']);
                    break;
            }
            Mage::log('"switch" finished!');
        }
    }

我正在尝试更改Products数组的这些元素,具体取决于数组中另一个元素的值。似乎没有发生的事情是它们不会被改变......一切都始终保持'no'值。我知道'attribute'值以正确的方式不同,并且函数正确地通过switch-cases,因为我在log中编写了测试。

我在调用我的函数后打印Products数组,并且没有更改。我认为它可以通过引用传递,但是没有...我也尝试以正常方式传递数组并从函数返回它 - 再次失败。

我做错了什么或做得不够?

哦,是的,我也尝试过以下方式switch-case

case '...':
    $Products['is_cargo'] = 'yes';
    $Products['is_bulky'] = 'no';
    $Products['is_firework'] = 'no';
    Mage::log('assigned '.$Products['attribute']);
    break;

nope再次......

2 个答案:

答案 0 :(得分:2)

您需要在foreach循环

中设置$ item“by reference”
foreach($Products as &$item)

答案 1 :(得分:1)

除了读取它们之外,你实际上并没有对输入数组做任何事情。

您需要更改输入数组,而不是$ item数组,$ item只是一个提取项。

基本上是这样的:

使用:

 foreach($Products as $key => $item)

并改为:

$Products[$key]['is_cargo'] = 'no';

理想情况下,您不要通过引用使用该函数,而是将函数的输出数组返回到脚本

添加了:

我会这样运行:

protected function _changeArray($Products)
{
    foreach($Products as $key => $product)
    {
        Mage::log('Type: '.$Products[$key]['attribute']);

        switch($Products[$key]['shipping_attribute'])
        {

            case '0':
                $Products[$key]['is_cargo'] = 'no';
                $Products[$key]['is_bulky'] = 'no';
                $Products[$key]['is_firework'] = 'no';
                break;
//etc

并在功能结束时返回$ products。

呼叫:

$ data = _changeArray($ data);