未定义的偏移PHP数组

时间:2013-06-05 09:33:27

标签: php arrays undefined

您好我有一个代码可以检查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)将被添加到$ profile,第二个(b)将不会被添加,第三个(c)将被添加,第四个(c)将被添加($())。现在,如果我再添加2个配置文件(e,f),将添加e而f将不添加。现在我在安装调试器时遇到了麻烦,所以我看不出它出了什么问题。我也收到错误消息:

  

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

  

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

有没有人知道哪里出错了?为什么?

2 个答案:

答案 0 :(得分: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])

答案 1 :(得分:0)

此代码存在一些问题,但主要问题是其中的一些逻辑存在缺陷。

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

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

修改

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

if (isset($profile[$teller]))