1

我是 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" />
4

4 回答 4

0

欢迎来到社区 :)

你可以使用min()函数来解决这个问题。无需使用循环或任何东西。

谁曾经提供过这个答案,请解释原因..

于 2013-08-11T10:45:32.587 回答
0

脚步

  • 加载源 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>

在 codepad 进行演示,这里是一个 XPath 教程,为您提供方便:

于 2013-08-11T10:53:43.213 回答
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 有想要的结果。这将适用于任何具有任意数量链接元素的子元素

于 2013-08-11T11:31:58.907 回答
-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;

我猜你希望它创建数组的数组,而它创建的数组对象的数组对象等等都混在一起了。

于 2013-08-11T11:57:17.047 回答