0

您好,我有一个代码可以检查 xml 文件中的重复项:

XML:

<?xml version="1.0"?>
<profielen>
    <profiel>
        <voornaam>a</voornaam>
        <achternaam>a</achternaam>
        <adres>a</adres>
        <postcode>a</postcode>
        <plaats>a</plaats>
        <email>a</email>
    </profiel>
    <profiel>
        <voornaam>b</voornaam>
        <achternaam>b</achternaam>
        <adres>b</adres>
        <postcode>b</postcode>
        <plaats>b</plaats>
        <email>b</email>
    </profiel>
    <profiel>
        <voornaam>c</voornaam>
        <achternaam>c</achternaam>
        <adres>c</adres>
        <postcode>c</postcode>
        <plaats>c</plaats>
        <email>c</email>
    </profiel>
    <profiel>
        <voornaam>c</voornaam>
        <achternaam>c</achternaam>
        <adres>c</adres>
        <postcode>cL</postcode>
        <plaats>c</plaats>
        <email>c</email>
    </profiel>
</profielen>

我可以选择 6 个复选框,选择的越多,它过滤的越多。如果我选择名字,只有 a,b 和名字为 c 的第一个人可以留下,第二个人将被忽略。

现在我有这个代码:

$xml = simplexml_load_file('/xampp/htdocs/UploadifyZWP/uploads/profiel.xml');
//Load the xml file into an array

$myArray = $_REQUEST['checkboxarray'];
//Contains the selected value (firstname = 0,lastname = 1 etc..)

if(count($myArray) <1){
    //If $myArray is empty it means no checkboxes are selected and there will be no filtering
    count($xml);
}else{
    $fields = $myArray;
    //If at least one field is selected, this code runs:
    switch(count($myArray)){
        case 1: 
            //One checkbox selected

            //Array where the profiles go withouth duplicates
            $profile = array();
            $passed = 0;
            $teller = 0;

            //Loops through all the profiles in the xml array
            while($passed < count($xml)){
                $add = false;

                //Checks for all the selected values, 1 checkbox is selected so only 0 (firstname) is selected and goes into $field
                foreach($fields as $field){
                    if(count($profile) < 1){
                        //If profile is empty, add the first profile from the xml array
                        $add = true;    
                    }else {
                        if($profile[$teller][$field] != $xml->profiel[$teller][$field])
                        {
                            $add = true;
                            break;

                        }else{
                            $teller++;
                            $passed++;
                        }
                    }
                }
                if($add = true){
                    //toevoegen
                    $profile[$teller] = $xml->profiel[$teller];
                    $teller++;
                    $passed++;  
                }
            }
            echo count($profile);
            print_r($profile);

            break;
        case 2:                         
            break;  
        case 3:                         
            break;  
        case 4:                         
            break;  
        case 5:                         
            break;  
        case 6:                         
            break;  
        default: echo "error";
    }


}

所以我把所有正确的配置文件放在 $profile 数组中,重复的将被忽略。现在为了测试,我打印了数组配置文件,看看它是否做了它应该做的事情,但结果不是我想要的。第一个 (a) 将被添加到 $profiles,第二个 (b) 不会,第三个 (c) 会再次添加,第四个 (duplicate(d)) 不会。现在,如果我再添加 2 个配置文件 (e,f),将添加 e 而不会添加 f。现在我在安装调试器时遇到了麻烦,所以我看不出哪里出错了。我还收到一条错误消息:

注意:未定义的偏移量:第37C:\xampp\htdocs\UploadifyZWP\ontdubbelen.php中的 1

注意:未定义的偏移量:第37C:\xampp\htdocs\UploadifyZWP\ontdubbelen.php中的 3

有谁知道哪里出了问题,为什么?

4

2 回答 2

0

在这一行if($profile[$teller][$field] != $xml->profiel[$teller][$field])中,您指定了多维数组的第三层,但您的数据只有 2 层,如下所示。

SimpleXMLElement Object
(
    [voornaam] => a
    [achternaam] => a
    [adres] => a
    [postcode] => a
    [plaats] => a
    [email] => a
)

试试这个

if($profile[$teller] != $xml->profiel[$teller])
于 2013-06-05T09:48:39.800 回答
0

这段代码有一些问题,但主要是其中的一些逻辑有缺陷。

我将首先说 if 语句if($add = true)将始终返回 true,因为您正在分配而不是比较。您需要使用if ($add == true)来执行比较。

除此之外,很难准确地说出你做错了什么,因为这是逻辑上的普遍失败。主要问题归结为这样一个事实,即在您的 while 循环(开始while($passed < count($xml)))的第二次迭代中,$profile数组在索引 0 处包含一个元素,(意味着count($profile) < 1返回false,但值为$tellernow 1,因为您在第一次增加了它迭代。然后您尝试比较 的值,但失败了,因为您的数组$profile[$teller][$field]中没有偏移量。1$profile

编辑

要检查数组中是否存在索引,可以使用isset,例如

if (isset($profile[$teller]))
于 2013-06-05T09:53:03.327 回答