使用来自外部XML(CDATA)的array_unique对数组进行排序

时间:2018-11-05 19:00:53

标签: php xml sorting cdata array-unique

我无法对数组进行算法排序。 这是我从外部XML获取的城市阵列。

XML看起来像这样,它是我要排序的节点localidad

<parada>
    <id>506</id>
    <localidad>
        <![CDATA[ Alvor ]]>
    </localidad>
    <parada>
        <![CDATA[ Alvor Baia Hotel (Bus Stop Alvor Férias) ]]>
    </parada>
    <lat>37.1296</lat>
    <lng>-8.58058</lng>
    <horasalida>05:40</horasalida>
</parada>

相关代码:

$xml = new SimpleXMLElement($viajes);
foreach ($xml->parada as $excursion) {
  $newParadasarray[] = $excursion->localidad;
}
$newParadasarray = array_unique($newParadasarray);

foreach ($newParadasarray as $parada) {

  if (strpos($parada, 'Almuñecar') !== false)
                  echo '<option value="Almuñecar">Almuñecar</option>';

  if (strpos($parada, 'Benalmádena') !== false)
                  echo '<option value="Benalmádena Costa">Benalmádena Costa</option>';

  if (strpos($parada, 'Estepona') !== false)
                  echo '<option value="Estepona">Estepona</option>';
  etc.
}

我尝试使用sort()array_values()

这是print_r($newParadasarray)的输出:

Array (
  [0]  => SimpleXMLElement Object ( [0] => SimpleXMLElement Object ( ) )
  [1]  => SimpleXMLElement Object ( [0] => SimpleXMLElement Object ( ) )
  [2]  => SimpleXMLElement Object ( [0] => SimpleXMLElement Object ( ) )
  [4]  => SimpleXMLElement Object ( [0] => SimpleXMLElement Object ( ) )
  [9]  => SimpleXMLElement Object ( [0] => SimpleXMLElement Object ( ) )
  [14] => SimpleXMLElement Object ( [0] => SimpleXMLElement Object ( ) )
  [20] => etc.

2 个答案:

答案 0 :(得分:2)

问题是您将SimpleXMLElement分配到数组中,而不是想要元素的内容,所以只需更改行即可。

$newParadasarray[] = $excursion->localidad;

$newParadasarray[] = trim((string)$excursion->localidad);

强制转换(string)接收文本内容,而trim()删除文本内容周围的多余空白。

我假设您有多个<parada>元素,以便$xml->parada返回正确的数据。

答案 1 :(得分:1)

如果您熟悉DOMDocument,则只需执行以下操作:

$doc = new DOMDocument();
$doc->loadXML($xml);
$array = array();

foreach($doc->getElementsByTagName("localidad") as $localidad) {
    $array[] = trim($localidad->nodeValue);
}

$array = array_unique($array);
sort($array);