PHP:使用in_array和__set方法

时间:2015-01-15 12:15:19

标签: php

我无法使用in_array匹配数组中的键,这与我的预期相反。

我尝试匹配的数组是使用魔术方法_props创建的__set()数组的一部分。

以下代码返回响应Incorrect result。这是代码,我希望它是相当不言自明的。

class foo{

    private $_props;

    public function __set($name, $val){
            $this->_props[$name] = $val;
    }

    public function test(){

            $md_array = array(
                    1 => array(0 => '0', 1 => '1'),
                    2 => array(0 => '0', 1 => '1'),
                    3 => array(0 => '0', 1 => '1')
            );

            $this->__set('test', $md_array);

            if(in_array(1, $this->_props['test'])){
                    echo "Correct result";
            }else{
                    echo "Incorrect result";
            }
   }
}
$a = new foo();
$a->test(); 

任何人都可以为我解释这种行为并提供替代方案吗?

如果我var_dump $this->_props我收到以下回复:

array
  'test' => 
    array
      1 => 
        array
          0 => string '0' (length=1)
          1 => string '1' (length=1)
      2 => 
        array
          0 => string '0' (length=1)
          1 => string '1' (length=1)
      3 => 
        array
          0 => string '0' (length=1)
          1 => string '1' (length=1)

提前致谢。

2 个答案:

答案 0 :(得分:1)

in_array()查看数组的值。据我了解,你想搜索键,你想使用array_key_exists()

        if(array_key_exists(1,$this->_props['test'])){
                echo "Correct result";
        }else{
                echo "Incorrect result";
        }

你应该得到正确的结果。如果你想要以递归的方式查找,请考虑使用array_find()

答案 1 :(得分:0)

你有一个multidim数组,所以in_array不适合你。 你需要一个自己的功能:

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}

并在您的代码中:

if(in_array_r(1, $this->_props['test'])){
                    echo "Correct result";
            }else{
                    echo "Incorrect result";
            }

看这里: in_array() and multidimensional array