PHP在xml中找到密钥的最小值

时间:2013-08-11 09:05:02

标签: php xml arrays

我是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 个答案:

答案 0 :(得分:0)

欢迎来到社区:)

您可以使用min()函数来解决此问题。 不需要使用循环或任何东西。

谁曾投入这个答案,解释原因..

答案 1 :(得分: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>

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;

我猜你期望它创建数组数组,同时它会创建数组对象数组的对象,所以混合起来。