通过引用挖掘数组是行不通的?

时间:2012-08-30 10:23:26

标签: php arrays reference variable-assignment

提供代码示例更容易:

private $ParseRuleMap = array();

public function __construct( $rules ) {
    foreach( $rules as $which=>$rule ) {
        $mapping = $rule->getMinimumMatchables();

        foreach( $mapping as $match ) {
            $rulelvl &= $this->ParseRuleMap;    // Fun begins here

             $len = strlen($match);
            for( $i=0; $i<$len; $i++ ) {
                if( !isset($rulelvl[ $match[$i] ]) ) {
                    $rulelvl[ $match[$i] ] = array();
                }
                $rulelvl &= $rulelvl[ $match[$i] ]; // Here too!
            }

            // ... other code here ...
        }
    }
}

我经常收到以下错误信息(对于上述注释行):

  

PHP警告:不能在第35行的parser.php中使用标量值作为数组

我是否误解了参考作业在这里的作用?为了(尝试)清楚,$rulelvl应该通过给定的$this->ParseRuleMap个子阵列迭代。基准分配。

2 个答案:

答案 0 :(得分:4)

&=bitwise operator(按位“和”并指定)而不是reference operator

更改您的代码:

$rulelvl = &$this->ParseRuleMap;    // note the = &

答案 1 :(得分:1)

  

我在这里作为答案的另一个提示,即使它只是一个评论。

你已经知道你做错了什么,但可能不清楚为什么。当然你输错了一些东西,但只是一个简短的提示:

  

1。)你的构造函数做得太多了。把这里完成的工作放在它自己的功能中。

public function __construct($rules) {
    $this->processRules($rules);
}

private function processRules($rules) {
    foreach ($rules as $which => $rule) {
        ...
    }
}

这降低了构造函数的复杂性。稍后您可能已经想要将正确的对象传递给构造函数,以便您可以从整个类中删除该预处理。但是现在这不是必要的,甚至可能永远不会变得必要,只是给出了一些展望。

  

2。)处理本身是嵌套和复杂的。通过将大问题分成更小的部分来降低复杂性。

当然这与您的需求有关,希望以下代码提供一些有用的示例,说明如何通过拆分多个函数来降低复杂性:

private function processRules($rules) {
    foreach ($this->rulesGetMappingsMatches($rules) as $match) {
        $this->parseRuleMapMatch($this->parseRuleMap, $match);
    }
}

private function parseRuleMapMatch(&$parseRuleMap, $match) {
    $len = strlen($match);
    foreach(str_split($match) as $char) {
        isset($parseRuleMap[$char])) || $parseRuleMap[$char] = array();
        $parseRuleMap = &$parseRuleMap[$char];
    }
    ...
}

private function rulesGetMappingsMatches($rules) {
    $matches = array();
    foreach ($rules as $rule) {
        foreach ($rule->getMinimumMatchables() as $match) {
            $matches[] = $match;
        }
    }
    return $matches;
}
  

3。)不要在不需要的情况下使用引用。

我不知道为什么在你的场景中你会使用引用。要获得更好的变量名称?然后它可能没问题。为了提高速度?那么除非你真的知道自己在做什么,否则你不应该那样做,因为PHP在优化速度和内存方面非常出色。并且通常最好让函数返回一个值而不是通过引用传递并然后修改该值。这也有助于代码重用和调试。

private function processRules($rules) {
    foreach ($this->rulesGetMappingsMatches($rules) as $match) {
        $this->parseRuleMap = $this->parseRuleMapMatch($this->parseRuleMap, $match);
    }
}

private function parseRuleMapMatch($parseRuleMap, $match) {
    ...
    return $parseRuleMap;
}
  

4。)最简单的解决方案通常是解决方案。

嗯,只是示范:

public function __construct( $rules ) {
    $this->importRulesMapFromArray($rules);
}

应该是非常自我说话。分而治之。还要说好名字。在编写代码时,你会减少错误。