Php,检查对象数组中是否存在property = value的对象

时间:2013-09-10 22:44:06

标签: php arrays object

我想我可以用这样的foreach循环来做到这一点:

 foreach ($haystack as $item)
       if (isset($item->$needle_field) && $item->$needle_field == $needle)
            return true;
 } 

但如果可以在没有循环的情况下完成,我会徘徊吗?

类似的东西:

  if(in_array($item->$needle_field == $needle,$haystack)
            return true;

4 个答案:

答案 0 :(得分:3)

这是可能的,但它没有任何好处:

<?php
function make_subject($count, $success) {
    $ret = array();
    for ($i = 0; $i < $count; $i++) {
        $object = new stdClass();
        $object->foo = $success ? $i : null;
        $ret[] = $object;
    }
    return $ret;
}

// Change true to false for failed test.
$subject = make_subject(10, true);

if (sizeof(array_filter($subject, function($value) {
    return $value->foo === 3;
}))) {
    echo 'Value 3 was found!';
} else {
    echo 'Value 3 was not found.';
}

输出Value 3 was found!

我建议你继续使用for循环:它是清晰的,不像保存你可能找到的任何一个技巧。

答案 1 :(得分:1)

是的,在现代PHP中,您可以通过组合array_column()(已经演化为也处理对象数组)的作用力来确定特定对象属性是否包含特定值而没有经典循环。 }。

代码:(Demo

in_array()

此技术的优点是语法简洁明了。对于相对少量的数据,这是一种完全可以接受的方法。

此技术的一个可能的缺点是$objects = [ (object)['cats' => 2], (object)['dogs' => 2], (object)['fish' => 10], (object)['birds' => 1], ]; $needleField = 'cats'; $needleValue = 2; var_export( in_array($needleValue, array_column($objects, $needleField)) ); // output: true 将生成一个与array_column()相关的所有值的新数组。

在我上面的演示中,$needleField仅会生成一个单元素数组,因为所有对象中只有一个array_column()属性。如果我们正在处理相对大量的数据,那么麻烦的是收集所有合格的cats值,然后在只需要一个匹配项即可返回cats时运行in_array(),这将是低效率的

对于“大量”数据,其中性能是脚本设计的主要标准,那么经典的true循环将是一个更好的选择,并且只要对象满足规则,就应停止循环通过foreachreturn

代码:(Demo

break

答案 2 :(得分:0)

如果要搜索的阵列超出控制范围,则此方法将不起作用。 但是,如果您是构建要搜索的对象数组的人,则可以在搜索时使用针作为array_key_exists使用的数组键来构造它。

例如,不要像这样创建$haystack数组:

[
  {
    'needle_field' => $needle
  },
  ...
]

使它像这样:

[
  $needle => {
    'needle_field' => $needle
  },
  ...
]

并像这样搜索:

if (array_key_exists($needle, $haystack)) {
  return true;
}

最后,如果需要,可以使用array_values

转换回整数索引数组
$haystack = array_values($haystack);

这可能无法在所有情况下都起作用,但对我来说很好。

答案 3 :(得分:-1)

也许使用array_key_exists

if (array_key_exists($needle_field, $haystack) { 
  if ($haystack[$needle_field] == $needle) {
    echo "$needle exists";
  }
}