我是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" />
答案 0 :(得分:0)
欢迎来到社区:)
您可以使用min()函数来解决此问题。 不需要使用循环或任何东西。
谁曾投入这个答案,解释原因..答案 1 :(得分:0)
<child>
元素。<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>
Demo at codepad这是一个方便的XPath教程:
答案 2 :(得分:0)
$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具有所需的结果。这适用于任何具有任意数量链接元素的子元素
答案 3 :(得分:-1)
用于排序的代码结构是正确的,因为如果我将数据从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;
我猜你期望它创建数组数组,同时它会创建数组对象数组的对象,所以混合起来。