问题摘要
为什么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
,让循环检查所有项目,并在循环外的末尾返回$records
或false
,如此
....
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)
移动到循环上方