SimpleXML对象数组只返回PHP中的第一个值


SimpleXML object array only return the first value in PHP

问题摘要

为什么SimpleXML对象数组只返回第一个值,而不返回所有数组元素。


问题解释

XML结构(简化)

<states>
    <state>
        <name>California</name>
        <cities>
            <city>
                <name>LosAngeles</name>
            </city>
            <city>
                <name>SanFrancisco</name>
            </city>
        </cities>
    </state>
    <state>
        <name>Nevada</name>
        <cities>
            <city>
                <name>LasVegas</name>
            </city>
        </cities>
    </state>
</states>

方法(简化)

我的City类中有getCityList方法:

public function getCityList( $givenState = false ){
    $records = array();
    $states = $this->states->state;
    [var_dump( $states->asXML() )]
    [var_dump( $states[0]->asXML() )]
    [var_dump( $states[1]->asXML() )]
    foreach( $states as $state ){
        if( empty( $givenState ) || ( $state->name == $givenState ) ){
            $cities = $state->cities->city;
            foreach( $cities as $city ){
                $records[ trim( $state->name ) ][] = trim( $city->name );   
            }
        }else{
            return false;   
        }
    }
    return $records;
}

对于$givenState = 'California'$givenState = 'Nevada'var_dump( $states->asXML() )给出:

<state>
    <name>California</name>
    <cities>
        <city>
            <name>LosAngeles</name>
        </city>
        <city>
            <name>SanFrancisco</name>
        </city>
    </cities>
</state>

var_dump( $states[0]->asXML() )给出:

<state>
    <name>California</name>
    <cities>
        <city>
            <name>LosAngeles</name>
        </city>
        <city>
            <name>SanFrancisco</name>
        </city>
    </cities>
</state>

CCD_ 7给出

<state>
    <name>Nevada</name>
    <cities>
        <city>
            <name>LasVegas</name>
        </city>
    </cities>
</state>

getCityList方法在$givenState = 'California'上返回正确结果,在$givenState = 'Nevada'上返回false

为什么这个数组有这种行为?

如何使其工作,以便也返回Nevada结果?

foreach( $states as $state )中的if第一次不匹配后执行return false;,如果第二次检查结果为false,则需要删除return false,让循环检查所有项目,并在循环外的末尾返回$recordsfalse,如此

....
if( empty($givenState){
    return false;
}
foreach( $states as $state ){
    if( $state->name == $givenState ){
        $cities = $state->cities->city;
        foreach( $cities as $city ){
            $records[ trim( $state->name ) ][] = trim( $city->name );   
        }
    }
}
return count($records) ? $records:false;

我还将empty($givenState)移动到循环上方