我是PHP新手,所以我需要一些帮助,因为我找不到我的错误。这是我的xml文件:
<children>
<child id="A">
<link id="C" age="10" />
<link id="B" age="13" />
<link id="H" age="12" />
</child>
<child id="B">
<link id="C" age="10" />
<link id="D" age="50" />
</child>
<child id="C">
<link id="I" age="50" />
</child>
</children>
这是我的php代码:
$xml = simplexml_load_file('data.xml');
$arr = (array) $xml;
function find_youngest($task_1, $task_2) {
if ($task_1['age'] === $task_2['age']) {
return 0;
}
return $task_1['age'] - $task_2['age'];
}
foreach ($arr as &$key) {
usort($key, 'find_youngest');
}
var_dump($arr[0]);
echo '<pre>';
print_r($arr);
echo '</pre>';
我想在每一个元素中都有最年轻的人,结果应该是这样的:
<link id1="A" id2="C" />
<link id1="B" id2="C" />
<link id1="C" id2="I" />
步骤
- 加载源XML
- 创建目标文档
- 对
<child>
元素进行迭代 - 通过XPath获取具有最低年龄属性的
<link>
元素 - 在目标文档中为每个返回的链接创建一个链接
代码
$children = simplexml_load_file('data.xml');
$links = simplexml_load_string('<links/>');
foreach ($children->child as $child) {
$youngestChild = $child->xpath(
'./link[
not(@age > following-sibling::link/@age)
and
not(@age > preceding-sibling::link/@age)]
'
);
$link = $links->addChild('link');
$link->addAttribute('id1', $child['id']);
$link->addAttribute('id2', $youngestChild[0]['id']);
}
echo $links->asXML();
输出(格式化我的):
<?xml version="1.0"?>
<links>
<link id1="A" id2="C"/>
<link id1="B" id2="C"/>
<link id1="C" id2="I"/>
</links>
代码板上的演示,这里有一个XPath教程,方便您:
- http://schlitt.info/opensource/blog/0704_xpath.html
欢迎加入社区:)
您可以使用min()函数来解决这个问题。不需要使用循环或任何东西。
谁曾经给出过这个答案,解释为什么。。
$strResult='';
$xml = simplexml_load_file('data.xml');
foreach($xml->child as $child){
$id1=$child['id'];
$tid='';
$tage=-1;
foreach($child->link as $link){
$id=$link['id'];$age=intval($link['age']);
if($tage<0 || $tage>$age){
$tage=$age;
$tid=$id;
}
}
$strResult.='<link id1="'.$id1.'" id2="'.$tid.'" />'."<br/>";
}
//$strResult具有所需的结果。这将适用于任何数量的具有任何数量的链接元素的子元素
用于排序的代码结构是正确的,因为如果我直接将xml文件中的数据写入数组,则代码会对其进行正确排序。
问题在于如何使用simplexml_load_file创建的对象。此外,一旦您决定了在哪种结构中获得输入,您需要编写正确的打印函数来只打印您感兴趣的位。
因此,如果我在一个数组中对xml进行编码,使用不同的年龄数字来强制它进行排序,我就得到了:
<?php
//$xml = simplexml_load_file('data.xml');
//$arr = (array) $xml;
$arr = array (array( array("id" => "C",
"age" => "50",
),
array("id" => "B",
"age" => "30",
),
array("id" => "H",
"age" => "12",
)
),
array( array("id" => "C",
"age" => "50",
),
array("id" => "D",
"age" => "10",
)
),
array( array("id" => "I",
"age" => "50",
)
)
);
function find_youngest($task_1, $task_2) {
if ($task_1['age'] === $task_2['age']) {
return 0;
}
return $task_1['age'] - $task_2['age'];
}
foreach ($arr as &$key) {
usort($key, 'find_youngest');
}
//var_dump($arr);
echo '<pre>';
print_r($arr);
echo '</pre>';
?>
输出的结果,基本上是print_r($arr)是
Array
(
[0] => Array
(
[0] => Array
(
[id] => H
[age] => 12
)
[1] => Array
(
[id] => B
[age] => 30
)
[2] => Array
(
[id] => C
[age] => 50
)
)
[1] => Array
(
[0] => Array
(
[id] => D
[age] => 10
)
[1] => Array
(
[id] => C
[age] => 50
)
)
[2] => Array
(
[0] => Array
(
[id] => I
[age] => 50
)
)
)
如您所见,$arr现在按年龄排序。因此,您可以从每个内部数组的第一个元素中获取要打印的年龄。
因此,代码中真正的问题是最初的部分:
$xml = simplexml_load_file('data.xml');
$arr = (array) $xml;
我想你希望它创建数组的数组,而它创建数组对象的数组对象,等等,所有这些都是混合的。