转换为数组VS is_array()

时间:2011-05-25 15:25:13

标签: php arrays performance casting

是否有人知道通过将变量转换为数组而不是先检查它而发生的任何问题,性能或其他问题?

// $v could be a array or string
$v = array('1','2','3'); 

OR

$v = '1';

而不是:

if (is_array($v)) foreach ($v as $value) {/* do this */} else {/* do this */}

我已经开始使用:

foreach((array) $v as $value) {
    // do this
}

它会停止代码的重复 - 但性能是我的想法,而不是丑陋的代码。

另外,有没有人知道php如何处理将数组转换为数组?没有抛出任何错误,但是php引擎是否检查它是否为数组,然后在执行强制转换过程之前返回结果?

3 个答案:

答案 0 :(得分:7)

第一:过早优化是万恶之源。永远不要让性能影响您的编码风格!

当你需要一个数组但是想要允许单个值时,转换为数组允许一些不错的技巧

$a = (array) "value"; // => array("value")

请注意,这可能会导致一些不需要的(或想要但不同的)行为

$a = new stdClass;
$a->foo = 'bar';
$a = (array) $a; // => array("foo" => "bar");

然而,这一个

if(is_array($v)) {
  foreach($v as $whatever) 
  {
    /* .. */
  }
} else {
  /* .. */
}

允许您决定可能发生的每种类型应该发生什么。如果你将它“盲目地”投射到数组中,这是不可能的。

简而言之:只需选择一个更符合情况需求的那个。

答案 1 :(得分:3)

正如Felix Kling所说,最好的解决方案是让您的数据来自保证其类型的来源。但是,如果你不能这样做,这里是1000000次迭代的比较:

check first: 2.244537115097s
just cast:   1.9428250789642s

source

只是在不检查(使用in_array)的情况下进行投射似乎(稍微)更快。

答案 2 :(得分:2)

这里的另一个选择是(当然,这也可以内联,以避免函数调用):

function is_array($array) {
      return ($array."" === "Array");
}

这似乎比is_array略快,但你的里程可能会有所不同。

像这样投射到数组的问题(这也是一个选项)

if ((array) $v === $v)

对于小型数组来说,它比is_array更快,但对于大型数组来说,速度要慢得多。