Php foreach с многомерным массивом
Я разрабатываю приложение php, которое использует класс базы данных для запроса mySQL.
класс находится здесь: http://net.tutsplus.com/tutorials/php/real-world-oop-with-php-and-mysql/
Я сделал некоторые настройки в классе, чтобы соответствовать моим потребностям, но есть проблема (может быть, глупая)
При использовании select() он возвращает многомерный массив, подобный таковому для таблицы с тремя столбцами (id, firstname, lastname):
Array
(
[0] => Array
(
[id] => 1
[firstname] => Firstname one
[lastname] => Lastname one
)
[1] => Array
(
[id] => 2
[firstname] => Firstname two
[lastname] => Lastname two
)
[2] => Array
(
[id] => 3
[firstname] => Firstname three
[lastname] => Lastname three
)
)
Теперь я хочу, чтобы этот массив использовался как результат mysql (mysql_fetch_assoc).
Я знаю, что он может использоваться с foreach(), но это с простыми массивами. поэтому я думаю, что мне нужно обновить новый foreach() с каждым foreach(), но я думаю, что это может замедлить или вызвать некоторую более высокую нагрузку на сервер.
Итак, как применить foreach() с этим многомерным массивом самый простой способ?
Спасибо
Ответы
Ответ 1
Вы можете использовать foreach здесь просто отлично.
foreach ($rows as $row) {
echo $row['id'];
echo $row['firstname'];
echo $row['lastname'];
}
Я думаю, что вы используете для доступа к данным с числовыми обозначениями (например, $row[0]
), но это необязательно. Мы можем использовать ассоциативные массивы для получения данных, которые нам нужны.
Ответ 2
Вы можете использовать array_walk_recursive
:
array_walk_recursive($array, function ($item, $key) {
echo "$key holds $item\n";
});
Ответ 3
Это был бы комментарий по запросу Брэда, но у меня недостаточно высокая репутация.
Недавно я обнаружил, что мне тоже нужен ключ многомерного массива, т.е. он был не просто индексом для массива в цикле foreach.
Чтобы достичь этого, вы можете использовать что-то очень похожее на принятый ответ, но вместо этого разделите ключ и значение следующим образом
foreach ($mda as $mdaKey => $mdaData) {
echo $mdaKey . ": " . $mdaData["value"];
}
Надеюсь, что это поможет кому-то.
Ответ 4
Holla/Hello,
Я понял! Вы можете легко получить имя файла, tmp_name, file_size и т.д. Поэтому я покажу вам, как получить имя файла с линией кода.
for ($i = 0 ; $i < count($files['name']); $i++) {
echo $files['name'][$i].'<br/>';
}
Он протестирован на моем ПК.
Ответ 5
Пример с mysql_fetch_assoc()
:
while ($row = mysql_fetch_assoc($result))
{
/* ... your stuff ...*/
}
В вашем случае с foreach
, с массивом $result
вы получите от select()
:
foreach ($result as $row)
{
/* ... your stuff ...*/
}
Это очень похоже на правильную итерацию.
Ответ 6
С массивами в php цикл foreach всегда является хорошим решением.
В этом случае это может быть, например:
foreach($my_array as $number => $number_array)
{
foreach($number_array as $data = > $user_data)
{
print "Array number: $number, contains $data with $user_data. <br>";
}
}
Ответ 7
В идеале многомерный массив, как правило, представляет собой массив массивов, поэтому я решил объявить пустой массив, а затем создать пары ключей и значений из результата db в отдельном массиве, наконец, натолкнуть каждый массив, созданный на итерации во внешний массив. вы можете вернуть внешний массив в случае, если это отдельный вызов функции. Надеюсь, что поможет
$response = array();
foreach ($res as $result) {
$elements = array("firstname" => $result[0], "subject_name" => $result[1]);
array_push($response, $elements);
}
Ответ 8
Чтобы получить детали из каждого значения в многомерном массиве, достаточно просто, как только у вас есть массив. Итак, это массив:
$example_array = array(
array('1','John','Smith'),
array('2','Dave','Jones'),
array('3','Bob','Williams')
);
Затем используйте цикл foreach и пропустите массив таким образом:
foreach ($example_array as $value) {
echo $value[0]; //this will echo 1 on first cycle, 2 on second etc....
echo $value[1]; //this will echo John on first cycle, Dave on second etc....
echo $value[2]; //this will echo Smith on first cycle, Jones on second etc....
}
Вы можете повторять все, что хотите, вокруг, чтобы эхо в таблицу:
echo "<table>"
foreach ($example_array as $value) {
echo "<tr><td>" . $value[0] . "</td>";
echo "<td>" . $value[1] . "</td>";
echo "<td>" . $value[2] . "</td></tr>";
}
echo "</table>";
Должна дать вам такую таблицу:
|1|John|Smith |
|2|Dave|Jones |
|3|Bob |Williams|
Ответ 9
Я знаю, что это довольно старый ответ.
Вот более быстрое решение без использования foreach
:
Используйте array_column
print_r(array_column($array, 'firstname')); #returns the value associated with that key 'firstname'
Также вы можете проверить перед выполнением вышеуказанной операции
if(array_key_exists('firstname', $array)){
print_r(array_column($array, 'firstname'));
}
Ответ 10
Не будет ли нормальный foreach в основном давать тот же результат, что и mysql_fetch_assoc в вашем случае?
при использовании foreach в этом массиве вы получите массив, содержащий эти три ключа: 'id', 'firstname' и 'lastname'.
Это должно быть то же самое, что и mysql_fetch_assoc (в цикле) для каждой строки.
Ответ 11
foreach ($parsed as $key=> $poke)
{
$insert = mysql_query("insert into soal
(pertanyaan, a, b, c, d, e, jawaban)
values
('$poke[question]',
'$poke[options][A]',
'$poke[options][B]',
'$poke[options][C]',
'$poke[options][D]',
'$poke[options][E]',
'$poke[answer]')");
}
Ответ 12
Если вам нужно выполнить строковые манипуляции с элементами массива, например, тогда использование функции обратного вызова array_walk_recursive (или даже array_walk) работает хорошо. И то, и другое пригодится при динамическом написании операторов SQL.
В этом случае у меня есть этот массив с каждым элементом, нуждающимся в запятой и новой строке.
$some_array = [];
данные в $ some_array
0: "Некоторая строка в массиве"
1: "Другая строка в массиве"
По php.net
Если обратный вызов должен работать с фактическими значениями массива, укажите первый параметр обратного вызова в качестве ссылки. Затем любые изменения, внесенные в эти элементы, будут внесены в сам исходный массив.
array_walk_recursive($some_array, function (&$value, $key) {
$value .= ",\n";
});
Результат:
"Некоторая строка в массиве, \n"
"Другая строка в массиве, \n"
Здесь та же концепция с использованием array_walk для добавления имени таблицы базы данных к полю.
$fields = [];
данные в $ полях:
0: "FirstName"
1: "Фамилия"
$tbl = "Employees"
array_walk($fields, 'prefixOnArray', $tbl.".");
function prefixOnArray(&$value, $key, $prefix) {
$value = $prefix.$value;
}
Результат:
"Employees.FirstName"
"Employees.LastName"
Мне было бы любопытно узнать, не является ли производительность проблемой foreach, но для массива с несколькими элементами, ИМХО, это вряд ли стоит рассматривать.