【问题标题】:PHP pass by reference issue - can't change type?PHP 通过引用传递问题 - 无法更改类型?
【发布时间】:2011-10-13 19:49:51
【问题描述】:

我有一个奇怪的现象。我希望有人可以向我解释那里发生了什么: 我想创建一个过滤器。来源类似于 '-10' 或 '10-20' 或 '20+' (类型字符串),结果应为 'Under $10', ... 以及 'product_price

但是将数组存储回原始字符串是行不通的。它只是提供'$Array'作为结果。难道不能通过引用传递并改变类型吗?

感谢您的知识!

    foreach($filters as &$filter){
        preg_match ('#^\-(\d+)$#ism', $filter, $match);
        if ($match[1]){
            $filter = array(
                'Under $'.intval($match[1]), 
                'product_price < '.intval($match[1])
            );
        }
        ...
    } 
    return $filtering;
}

P.S.:我不是在寻找解决方案,因为我可以将原始字符串更改为数组,或者我可以将 foreach 更改为 pass by value 并使用 $newFilter[] 之类的数组创建一个新数组= ...我只是好奇

【问题讨论】:

    标签: php pass-by-reference


    【解决方案1】:

    你可以改变它的类型。构造证明:

    <?php
    header('Content-type:text/plain');
    
            $arr = array(
                    '1',
                    '2',
            );
    
            foreach ($arr as &$filter) {
                    $filter = array($filter);
            }
    
            print_r($arr);
    ?>
    

    打印:

    Array
    (
        [0] => Array
            (
                [0] => 1
            )
    
        [1] => Array
            (
                [0] => 2
            )
    
    )
    

    【讨论】:

    • 谢谢!以下逻辑中的错误(未复制)导致了问题。它现在工作正常。
    【解决方案2】:

    你应该把你的 foreach 改成

    foreach($filters as $index => $filter)
    

    并通过以下方式更新您的过滤器

    $filters[$index] = array(...);
    

    我相信 foreach() 语句创建的 $filter 变量是数组中数据的副本,而不是对它的引用。

    【讨论】:

    • 对不起,我打错了。因为是引用传递,所以当然是foreach($filters as &amp;$filter)
    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 2011-03-14
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    相关资源
    最近更新 更多