PHP in_array对象比较?

gor*_*i93 16 php

在能in_array功能比较的对象?

例如,我有一个对象数组,我想将它们明确地添加到另一个数组.是否可以检查是否已添加对象:

in_array($distinct, $object);
Run Code Online (Sandbox Code Playgroud)

或者还有其他方法吗?

Ala*_*blo 25

你可以使用严格的比较:

in_array($object, $array, TRUE);
Run Code Online (Sandbox Code Playgroud)

用法示例:

$a = new stdClass();
$a->x = 42;

$b = new stdClass();
$b->y = 42;

$c = new stdClass();
$c->x = 42;

$array = array($a,$b);

echo in_array($a, $array, true); // 1
echo in_array($b, $array, true); // 1
echo in_array($c, $array, true); //
Run Code Online (Sandbox Code Playgroud)


ukl*_*viu 13

in_array功能无法比较的对象.

您应该从对象创建唯一的键值对,并且只需在将新对象插入最终数组时比较这些键.

假设每个对象都有一个唯一的id属性,可能的解决方案是:

$unique_objects = array();

// $data represents your object collection
foreach ($data as $item) {
    if (!array_key_exists($item->id, $unique_objects)) {
        $unique_objects[$item->id] = $obj;
    }
}
Run Code Online (Sandbox Code Playgroud)


Daa*_*aan 6

我做了一些测试,将对象与in_array函数进行比较。这是我的结论:

当您尝试在数组(如 OP)中查找对象的相同实例in_array时,可以使用严格比较布尔集。

当您尝试查找同一类但具有不同实例的任何对象时,in_array会显示违反直觉的行为。

PHP.net 上有一个关于反直觉边缘情况的精彩用户评论。

// Example array

$array = array(
    'egg' => true,
    'cheese' => false,
    'hair' => 765,
    'goblins' => null,
    'ogres' => 'no ogres allowed in this array'
);

// Loose checking -- return values are in comments

// First three make sense, last four do not

in_array(null, $array); // true
in_array(false, $array); // true
in_array(765, $array); // true
in_array(763, $array); // true
in_array('egg', $array); // true
in_array('hhh', $array); // true
in_array(array(), $array); // true

// Strict checking

in_array(null, $array, true); // true
in_array(false, $array, true); // true
in_array(765, $array, true); // true
in_array(763, $array, true); // false
in_array('egg', $array, true); // false
in_array('hhh', $array, true); // false
in_array(array(), $array, true); // false
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,如果不严格检查,in_array测试 4 - 7 就没有意义。

从 PHP.net 中我们知道,只有当两个对象===来自同一个类 + 实例时,它们才通过严格比较( )才相同。当两个对象来自同一类时,它们在松散比较 ( )中已经相同。==

我用对象编写了一些测试来看看会发生什么。

$a = new stdClass();                              
$a->egg = true;                                   

$b = new stdClass();                              
$b->cheese = false;                               

$c = new stdClass();                              
$c->hair = 765;                                   

$d = new stdClass();                              
$d->goblins = null;                               

$e = new stdClass();                              
$e->ogres = 'no ogres allowed in this array';     

$array2 = array($a, $b, $c,  $d, $e);         

$e = new stdClass();                                            
$e->egg = null;                                                 

$f = new stdClass();                                            
$f->egg = false;                                                

$g = new stdClass();                                            
$g->egg = 765;                                                  

$h = new stdClass();                                            
$h->egg = 763;                                                  

$i = new stdClass();                                            
$i->egg = 'egg';                                                

$j = new stdClass();                                            
$j->egg = 'hhh';                                                

$k = new stdClass();                                            
$k->egg = array();                                              

in_array($e, $array2, false); // false                
in_array($f, $array2, false); // false                
in_array($g, $array2, false); // true                 
in_array($h, $array2, false); // true                 
in_array($i, $array2, false); // true                 
in_array($j, $array2, false); // true                 
in_array($k, $array2, false); // false                

in_array($e, $array2, true); // false                 
in_array($f, $array2, true); // false                 
in_array($g, $array2, true); // false                 
in_array($h, $array2, true); // false                 
in_array($i, $array2, true); // false                 
in_array($j, $array2, true); // false                 
in_array($k, $array2, true); // false 
Run Code Online (Sandbox Code Playgroud)

在最后的检查中,in_array检查 3 - 6 给出了反直觉的结果。

理由如下。如果你试图找到任何具有特定值的对象,你就被迫使用松散比较(因为当类不相同时,严格比较总是失败)。但由于PHP 的变量类型,在最后的测试中,这些检查被认为是 true,因为该值被认为是 true。另请注意,在松散比较中,对象上的键将被忽略。