PHP在xml中查找关键字的最小值


PHP find min value of key in xml

我是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;

我想你希望它创建数组的数组,而它创建数组对象的数组对象,等等,所有这些都是混合的。