Как перебрать массивы массивов в PHP - PullRequest
0 голосов
/ 05 сентября 2011

Я хотел бы взять массив с такой структурой:

array
  'Alabama' => 
    array
      0 => 
        array
          'id' => string '11' (length=2)
          'region_name' => string 'Alabama' (length=7)
          'city' => string 'Birmingham' (length=10)
      1 => 
        array
          'id' => string '12' (length=2)
          'region_name' => string 'Alabama' (length=7)
          'city' => string 'Huntsville' (length=10)
      2 => 
        array
          'id' => string '13' (length=2)
          'region_name' => string 'Alabama' (length=7)
          'city' => string 'Mobile' (length=6)
      3 => 
        array
          'id' => string '14' (length=2)
          'region_name' => string 'Alabama' (length=7)
          'city' => string 'Montgomery' (length=10)
  'Alaska' => 
    array
      0 => 
        array
          'id' => string '15' (length=2)
          'region_name' => string 'Alaska' (length=6)
          'city' => string 'Anchorage' (length=9)

И создать неупорядоченные списки в формате HTML, например, так:

<ul id="A">
    <li class="state">Alabama</li> 
    <li>Birmingham</li>
    <li>Huntsville</li>
    <li>Mobile</li>
    <li>Montgomery</li>
    <li class="state">Alaska</li>
    <li>Anchorage</li>
</ul> 
<ul id="C">
    <li class="state">California</li>
    <li>Bakersfield</li>
    <li>Fresno</li>
    <li>Los Angeles</li>
</ul>
<ul id="D">
    <li class="state">DC</li>
    <li>Washington</li>
</ul>

Идея в алфавитном порядке исгруппированные серии неупорядоченных списков, которые я могу легко показать и скрыть с помощью JavaScript.Эта часть проста ... Эта часть, я потерян.

Я пробовал своего рода вложенный цикл foreach, но используемая среда отказалась делать это, ссылаясь на ошибки OutputEscaper, которые, как я считаю,Имеет смысл - я действительно не уверен, как это сделать правильно.

Буду признателен за любую помощь!

edit: Вот как изначально форматируется массив:

$this->cityGroups = array();
foreach($this->USCities as $city)
{
  $this->cityGroups[$city['region_name']][] = $city;
}

Ответы [ 2 ]

2 голосов
/ 05 сентября 2011

Это просто и не нуждается в фреймворке. Если ваши данные были отформатированы, как я уже упоминал в моем комментарии ...

$data = array('Alabama' => array('Birmingham', 'Huntsville', 'Mobile', 'Montgomery'),
              'Alaska' => array('Anchorage'));
ksort($data);
$formatted = array();
foreach($data as $state => $cities) {
    $formatted[$state{0}][$state] = $cities;
}

foreach($formatted as $letter => $states) {
    echo '<ul id="'.$letter.'">';
    foreach($states as $state => $cities) {
        sort($cities);
        echo '<li class="state">'.$state.'</li>'
        foreach($cities as $city) {
            echo '<li>'.$city.'</li>';
        }
    }
    echo '</ul>';
}
1 голос
/ 05 сентября 2011

Это решение должно достичь того, что вы ищете:

$lastLetter = "A";
print( '<ul id="A">' );
foreach( $myArray as $key => $array ){
    if( strtoupper( substr( $key, 0, 1 ) ) != $lastLetter ){
        print( '</ul>' );
        $lastLetter = strtoupper( substr( $key, 0, 1 ) );
        print( '<ul id="' . $lastLetter . '">' );
    }
    print( '<li class="state">' . $key . '</li>' );
    foreach( $array as $subArr ){
        print( '<li>' . $subArr['city'] . '</li>' );
    }
}
print( '</ul>' );

Если вам нужно объяснение по какой-либо конкретной части, пожалуйста, дайте мне знать.

Альтернативное решение, если ваша начальная буква является переменной (может или не может быть A)

Изменение:

$lastLetter = "A";
print( '<ul id="A">' );

до:

$temp = array_keys( $myArray );
$lastLetter = strtoupper( substr( $temp[0], 0, 1 ) );
print( '<ul id="' . $lastLetter . '">' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...