Хранить MySQL в массиве PHP для двух запросов

Как создать, сохранить и вывести массив, который использует два разных запроса mysql?

Я попытался сделать простой пример.

$select1 = "SELECT country_id, country_name FROM countries ..."; while ($select1) { ...store country results in array... $select2 = "SELECT city_id, city_name FROM cities where '" . $select1['country_id'] . "'..."); // depends on select1 while ($select2) { ...store city results in array... } } **output something like this:** country_id = 1 country_name = United States city_id = 1 city_name = New York city_id = 2 city_name = Las Vegas country_id = 2 country_name = Canada city_id = 3 city_name = Ottawa 

Solutions Collecting From Web of "Хранить MySQL в массиве PHP для двух запросов"

Я не знаю, проверяете ли вы ошибки, готовитесь или избегаете своих запросов, но, пожалуйста, сделайте это.

Чтобы создать массив, вы можете сделать это с помощью этого:

  $list = []; $countries = $link->query("SELECT country_id, country_name FROM countries ..."); while ($country_row /*fetch from $countries*/) { $country_id = $country_row['country_id']; $country_info = [ 'country_id' => $country_id, 'country_name' => $country_row['country_name'], 'country_cities' => [] ]; $cities_stmt = "SELECT city_id, city_name FROM cities where $country_id..."; $cities = $link->query($cities_stmt); while ($city_row /*fetch from $cities*/) { $city_id = $city_row['city_id']; $country_info['country_cities'][$city_id] = [ 'city_id' => $city_id, 'city_name' => $city_row['city_name'] ]; } $list[$country_id] = $country_info; } 

Для отображения массива вы можете:

  foreach ( $list as $country_id => $country_info ) { echo "Country ID: $country_id<br />"; echo 'Country Name: ' . $country_info['country_name'] . '<br />'; echo 'Country Cities:<br />'; $cities = $country_info['country_cities']; foreach ( $cities as $city_id => $city_info ) { echo " City ID: $city_id<br />"; echo ' City Name: ' . $city_info['city_name'] . '<br />'; } echo '<br />'; } 

Кроме того, если вы знаете идентификатор страны или города, вы можете сделать:

  echo 'City Name: ' . $list[$country_id]['country_cities'][$city_id]['city_name'] . '<br />'; 

Используйте country_id как ключ для вашего массива. Итак, в основном,

 $select1 = mysqli_query("SELECT country_id, country_name FROM countries"); while ($country_row = mysqli_fetch_array($select1, MYSQLI_ASSOC)) { $array[$country_id]['country_id'] = $country_row ['country_id']; $array[$country_id]['country'] = $country_row['country_name']; $select2 = mysqli_query("SELECT city_id, city_name FROM cities where '" . $select1['country_id'] ."' "); // depends on select1 while ($city_row = mysqli_fetch_array($select2, MYSQLI_ASSOC)) { $array[$country_id]['cities'][]['city_id'] = $city_row['city_id']; $array[$country_id]['cities'][]['city_name'] = $city_row['city_name'] } } 

Чтобы распечатать их обратно с помощью foreach (как вы просили в комментариях), вы должны пройти через оба уровня массива

 foreach($array as $country){ //Loop through the countries that we queried and stored echo 'Country Name: '.$country['country_name'].'<br/>'; echo 'Country ID: '.$country['country_id'].'<br/>'; echo 'Cities in country: <br/>'; //Loop through the cities within this country foreach($country['cities'] as $city){ echo 'City ID: '.$city['city_id'].'<br/>'; echo 'City Name: '.$city['city_name'].'<br/>'; } } 

Вывод одного запроса и отправка его по почте в другой запрос во вложенном цикле – это анти-шаблон. Используйте соединение:

 select country_ID, country_name, City_Id, city_name From countries cn Inner join cities ct On CT.country_id = cn.country_ID 

Затем….

 $cities=array(); $country_names=array(); While($r=mysqli_fetch_array($handle)) { $country_names[$r['country_id']]=$r['country_name']; If (!is_array($cities[$r['country_id'])) $cities[$r['country_id']]=array(); $cities[$r['country_id']][$r['city_id']]=$r['city_name']; }