【问题标题】:Check if array of Objects contains second array of Objects检查对象数组是否包含第二个对象数组
【发布时间】:2014-05-09 13:24:17
【问题描述】:

我需要检查DOMNode 对象数组是否包含DOMNode 对象类似数组中的所有项目。

一般来说,为了检查一个数组是否包含另一个数组,我尝试了this question 中列出的一些方法。但是,array_intersect()array_diff() 都比较基于 (string) $elem1 === (string) $elem2 的数组项 - 这会为 DOMElements 引发以下错误,因为它们无法转换为字符串。

PHP Catchable fatal error: 
Object of class DOMElement could not be converted to string in...

处理这个问题的正确方法是什么?

【问题讨论】:

  • 不应为对象比较进行字符串转换。只需简单比较即可验证对象是否相等。见stackoverflow.com/questions/11172506/…
  • 如果数组 A 包含与数组 B 相同的节点,您想知道两个数组是否与相同的 DOMNodes 相同或只是不同或真或假?
  • @TimDev - 如果 ArrayA 包含 ArrayB 中的所有内容,我正在寻找真/假。
  • 您需要创建自己的方法,没有其他 diff 方法可以做到这一点。
  • 如果你想知道它们是否完全相同,你可以序列化数组并简单地比较。但这不是你需要的。但是您可以序列化您在方法中循环的每个项目!祝你好运!

标签: php dom-node


【解决方案1】:

我已经做到了,这似乎可行,例如,我用各种对象和类型填充了两个数组,只是为了看看它是否可行:

$array = array(new DOMDocument(), 'foobar', 112312, new DateTime('Y'));
$array2 = array(new DOMDocument(), 'foobar',12312, false, new DateTime('Y'), 112312, true);

var_dump(array_diff_two($array,$array2)); //returns true

$array = array(new DOMDocument(), 'foobar', 112312, new DateTime('m'));
$array2 = array(new DOMDocument(), 'lorem ipsum!',12312, false, new DateTime('Y'), 112312, true);

var_dump(array_diff_two($array,$array2)); //returns false

function array_diff_two($array1, $array2){
    // serialize all values from array 2 which we will check if they contain values from array 1
    $serialized2 = array();
    foreach ($array2 as $value){
        $serialized2[] = serialize($value);
    }

    // Check if all values from array 1 are in 2, return false if it's not found
    foreach ($array1 as $value) {
        if (! in_array(serialize($value), $serialized2)) {
            return false;
        }
    }
    return true;
}

【讨论】:

  • 与我所做的基本相同的逻辑,但更具可读性!干杯!
【解决方案2】:

正如我现在所写的,这里有一个替代解决方案。在我看来,Tim's solution 更具可读性。

//Does array of DOMNodes contain other array DOMNodes
private function array_contains_array($haystack,$needle){
    //Create object hash array of $haystack
    $haystackHashArr = array();
    foreach ($haystack as $idx => $haystackObj) {
        $haystackHashArr[$idx] = spl_object_hash($haystackObj);
    }

    //Now search for hashes of needle array objects in Haystack-hash-Array
    foreach ($needle as $domNode) {
        $huntedForHash = spl_object_hash($domNode);
        foreach($haystackHashArr as $hsHash){
            if ($hsHash == $huntedForHash) continue 2;
        }
        //Only get here if an item not found (Due to continue statement)
        return false;
    }
    return true;
}

【讨论】:

    猜你喜欢
    • 2020-06-07
    • 2015-01-22
    • 1970-01-01
    • 2016-04-24
    • 2021-03-09
    • 2020-08-09
    • 1970-01-01
    • 2019-07-26
    • 2011-04-02
    相关资源
    最近更新 更多