PHP С 2 массивами, как я могу получить первый элемент, который существует в обоих массивах, на основе порядка первого массива?

0

Я пытаюсь сравнить два массива, чтобы получить первый элемент, который существует в обоих массивах. Я думал, что могу использовать array_intersect для этого, но он, похоже, не работает.

Вот пример моего кода.

<?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.

  • 0
    Один цикл, вложенный в другой, сделает это. Или вы пытались оставить элементы массивов в виде строк и создать элемент SimpleXMLE только после нахождения пересечения?
  • 0
    Я получаю оба массива в виде элементов XML от веб-службы. Я надеялся избежать вложенных циклов для производительности.
Теги:
arrays
array-intersect

1 ответ

1
Лучший ответ

Это нормально, потому что это просто сравнение, если это тот же тип объекта.

У вас есть два варианта:

  1. Измените параметры, которые вы используете, сравнивая строку вместо simpleXMLElement с функцией array_intersect. Не рекомендуется, потому что вы не сравниваете фактические значения каждого узла 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
        )

)
  • 0
    В конце я $simpleXml->asXML() варианте 1, так как было проще просто вызвать $simpleXml->asXML() чем использовать цикл. Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню