Si hay un archivo XML que contiene lo siguiente, ¿cómo se pueden eliminar los objetos duplicados? No parece haber una función PHP SimpleXML que lo haga. Cualquier ayuda será apreciada.

<?xml version="1.0"?>
<cars>
  <car>
<year>2000</year>
<make>cheverolet</make>
<model>malibu</model>
</car>
  <car>
<year>2019</year>
<make>cheverolet</make>
<model>malibu</model>
</car>
  <car>
<year>2000</year>
<make>cheverolet</make>
<model>malibu</model>
</car>
</cars>
-1
65535 28 jun. 2019 a las 18:24

1 respuesta

La mejor respuesta

El uso de SIMEXML funcionará y puede usar unset() para eliminar los elementos, aquí almaceno los que ya se encuentran en una matriz y verifiquen antes de eliminarlo o agregarlo como una combinación recién encontrada.

La única complicación es la cosa habitual de los elementos insontables en una lista que está modificando, por lo que aquí solo sigo apuntar a el elemento real en la lista y solo incrementarlo cuando encuentre uno único. Esto usa xpath() para encontrar la lista de autos para que se vea para que la lista se mantenga independiente de la lista que se está modificando ...

$found = [];
$xml = simplexml_load_string($data);

$carPos = 0;
foreach ( $xml->xpath("//car") as $key => $car )   {
    $carType = (string)$car->year.",".(string)$car->make.",".(string)$car->model;
    if ( isset ( $found[$carType]) )    {
        unset ($xml->car[$carPos]);
    }
    else    {
        $found[$carType] = true;
        $carPos++;
    }
}
2
Nigel Ren 28 jun. 2019 a las 16:17