Подтвердить что ты не робот

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() с этим многомерным массивом самый простой способ?

Спасибо

4b9b3361

Ответ 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, но для массива с несколькими элементами, ИМХО, это вряд ли стоит рассматривать.