PHP对于2个数组,如何根据第一个数组的顺序获得两个数组中存在的第一个元素


PHP With 2 arrays how do I get first element that exists in both arrays based on the order of the first array?

我试图比较两个数组,以获得两个数组中存在的第一个元素。我想我可以使用array_incross来做这件事,但它似乎不起作用。

下面是我的代码的一个代表性示例。

<?php
$a1=array(
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>ZPL</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'));
$a2=array(
    new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>PDF</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PDF</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>NONE</LabelSize><LabelFormat>NONE</LabelFormat></LabelSpec>')
);
$result=array_intersect($a1,$a2);
print_r($result);
?>

这给了我输出

Array ( [0] => SimpleXMLElement Object ( [LabelSize] => 6 [LabelFormat] => ZPL ) [1] => SimpleXMLElement Object ( [LabelSize] => 6 [LabelFormat] => EPL ) [2] => SimpleXMLElement Object ( [LabelSize] => 6 [LabelFormat] => PNG ) [3] => SimpleXMLElement Object ( [LabelSize] => 6 [LabelFormat] => JPG ) )

正如您所看到的,来自$a1的第一个元素存在于交集中,即使它不存在于$a2中。

这是正常的,因为它只是在比较是否是相同类型的对象。

你有两个选择:

  1. 通过将字符串(而不是simpleXMLElement)与array_incross函数进行比较来更改正在使用的参数。不推荐使用,因为您没有比较每个xml节点的实际值
<?php
$a1=array(
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>ZPL</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'));
$a2=array(
        ('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>PDF</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PDF</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>NONE</LabelSize><LabelFormat>NONE</LabelFormat></LabelSpec>')
        );
$result=array_intersect($a1,$a2);
print_r($result);

这将返回:

Array
(
    [1] => <LabelSpec><LabelSize>6</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>
    [2] => <LabelSpec><LabelSize>6</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>
    [3] => <LabelSpec><LabelSize>6</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>
)
  1. 编写一个自定义函数,以使用所需的逻辑匹配节点的值。这是一个更好的解决方案
   $a1 = array(
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>ZPL</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'));
    $a2 = array(
        new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>PDF</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PDF</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>NONE</LabelSize><LabelFormat>NONE</LabelFormat></LabelSpec>')
    );
    function customIntersect($arr1, $arr2)
    {
        $result = array();
        foreach ($arr1 as $simplexml1) 
        {
            foreach ($arr2 as $simplexml2) 
            {
                // Your custom comparison logic should be here ...
                if (((string) $simplexml1->LabelSize == (string) $simplexml2->LabelSize) && 
                    ((string) $simplexml1->LabelFormat == (string) $simplexml2->LabelFormat))
                {
                    $result[] = $simplexml1;
                }
            }
        }
        return $result;
    }
    print_r(customIntersect($a1, $a2));

将返回:

Array
(
    [0] => SimpleXMLElement Object
        (
            [LabelSize] => 6
            [LabelFormat] => EPL
        )
    [1] => SimpleXMLElement Object
        (
            [LabelSize] => 6
            [LabelFormat] => PNG
        )
    [2] => SimpleXMLElement Object
        (
            [LabelSize] => 6
            [LabelFormat] => JPG
        )
)