SimpleXML 对象数组仅 return PHP 中的第一个值

SimpleXML object array only return the first value in PHP

问题总结

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


问题解释

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 方法 class:

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>

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

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

getCityList 方法 return 在 $givenState = 'California' 上的正确结果和 false$givenState = 'Nevada' 上的正确结果。

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

我怎样才能让它工作,以便 Nevada 结果也被 return 编辑?

您在 foreach( $states as $state ) 中的 if 中第一次不匹配后正在执行 return false; 如果为什么第二次检查为假,您需要删除 return false 和让循环检查所有项目和 return $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) 移动到循环

上方