PHP Foreach с многомерным массивом - PullRequest
50 голосов
/ 20 июня 2011

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

класс здесь: http://net.tutsplus.com/tutorials/php/real-world-oop-with-php-and-mysql/

Я сделал несколько изменений в классе, чтобы соответствовать моим потребностям, но есть проблема (может быть, глупая)

При использовании select () он возвращает многомерный массив, подобный этому, для таблицы с 3 столбцами (id, firstname, фамилия):

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 (), но я думаю, что это может замедлить или вызвать более высокую нагрузку на сервер.самый простой способ?

Спасибо

Ответы [ 12 ]

107 голосов
/ 20 июня 2011

Вы можете просто использовать foreach здесь.

foreach ($rows as $row) {
    echo $row['id'];
    echo $row['firstname'];
    echo $row['lastname'];
}

Я думаю, что вы привыкли получать доступ к данным с помощью числовых указателей (например, $row[0]), но это не обязательно.Мы можем использовать ассоциативные массивы , чтобы получить данные, которые нам нужны.

14 голосов
/ 20 июня 2011

Вы можете использовать array_walk_recursive:

array_walk_recursive($array, function ($item, $key) {
    echo "$key holds $item\n";
});
4 голосов
/ 06 ноября 2014

Это был бы комментарий под ответом Брэда, но у меня недостаточно высокая репутация.

Недавно я обнаружил, что мне нужен также ключ многомерного массива, т. Е. Он не былпросто индекс для массива в цикле foreach.

Для этого вы можете использовать что-то очень похожее на принятый ответ, но вместо этого разделите ключ и значение следующим образом

foreach ($mda as $mdaKey => $mdaData) {
    echo $mdaKey . ": " . $mdaData["value"];
}

Надеюсь, это кому-нибудь поможет.

3 голосов
/ 20 июня 2016

Холла / Привет , я понял!Вы можете легко получить имя файла, tmp_name, file_size и т. Д. Так что я покажу вам, как получить имя файла с помощью строки кода.

for ($i = 0 ; $i < count($files['name']); $i++) {
    echo $files['name'][$i].'<br/>';
}

Он протестирован на моем ПК.

3 голосов
/ 31 марта 2015

С массивами в 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>";
        }
    }
2 голосов
/ 12 июня 2016

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

$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|
2 голосов
/ 20 июня 2011

Пример с mysql_fetch_assoc():

while ($row = mysql_fetch_assoc($result))
{
    /* ... your stuff ...*/
}

В вашем случае с foreach, с массивом $result, полученным из select():

foreach ($result as $row)
{
    /* ... your stuff ...*/
}

Это очень похоже на ту же самую итерацию.

1 голос
/ 15 мая 2017

Я знаю, что это довольно старый ответ. Вот более быстрое решение без использования 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'));
}
1 голос
/ 19 февраля 2015

В идеале многомерный массив обычно представляет собой массив массивов, поэтому я решил объявить пустой массив, затем создать пары ключей и значений из результата db в отдельном массиве, и, наконец, поместить каждый массив, созданный при итерации, во внешний массив.Вы можете вернуть внешний массив в случае, если это отдельный вызов функции.Надеюсь, это поможет

$response = array();    
foreach ($res as $result) {
        $elements = array("firstname" => $result[0], "subject_name" => $result[1]);
        array_push($response, $elements);
    }
0 голосов
/ 09 января 2019

Если вам нужно выполнить строковые манипуляции с элементами массива, например, с помощью функции обратного вызова array_walk_recursive (или даже array_walk ) работает хорошо. И то и другое пригодится при динамическом написании операторов SQL.

В этом случае у меня есть этот массив с каждым элементом, нуждающимся в запятой и новой строке.

$some_array = [];

данные в $ some_array
0: «Некоторая строка в массиве»
1: «Другая строка в массиве»

За php.net

Если callback должен работать с фактическими значениями массива, укажите первый параметр обратного вызова в качестве ссылки. Тогда любой изменения, внесенные в эти элементы, будут внесены в исходный массив сам по себе.

array_walk_recursive($some_array, function (&$value, $key) {
    $value .= ",\n";
});

Результат:
"Некоторая строка в массиве, \ n"
"Другая строка в массиве, \ n"

Вот та же концепция, использующая array_walk для добавления имени таблицы базы данных к полю.

$fields = [];

данные в $ полях:
0: «Имя»
1: «Фамилия»

$tbl = "Employees"

array_walk($fields, 'prefixOnArray', $tbl.".");

function prefixOnArray(&$value, $key, $prefix) { 
    $value = $prefix.$value; 
}

Результат:
"Employees.FirstName"
"Employees.LastName"


Мне было бы любопытно узнать, не является ли производительность проблемой foreach, но для массива с несколькими элементами, ИМХО, вряд ли стоит об этом думать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...