it-swarm.com.ru

pHP Foreach с многомерным массивом

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

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

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

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

 Array 
 (
 [0] => Массив 
 (
 [Id] => 1 
 [Firstname] => Имя одного 
 [Фамилия] => Фамилия один 
) 

 [1] => Массив 
 (
 [Id] => 2 
 [Firstname] => Имя два 
 [Фамилия] => Фамилия два
) 

 [2] => Массив 
 (
 [Id] => 3 
 [Имя] => Имя три 
 [Фамилия] => Фамилия три 
) 
) 

Теперь я хочу, чтобы этот массив использовался как результат mysql (mysql_fetch_assoc).

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

Итак, как применить foreach () с этим многомерным массивом самым простым способом?

Спасибо

47
medk

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

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

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

104
Brad

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

array_walk_recursive($array, function ($item, $key) {
    echo "$key holds $item\n";
});
13
Karolis

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

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

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

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

Надеюсь, что это помогает кому-то.

4
arvy3

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

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

Это проверено на моем ПК.

3
Asraful Haque

Пример с mysql_fetch_assoc():

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

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

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

Это похоже на то же самое, с правильной итерацией.

2
aorcsik

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

$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
Rmj86

С массивами в 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
nao_de_naoned

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

$response = array();    
foreach ($res as $result) {
        $elements = array("firstname" => $result[0], "subject_name" => $result[1]);
        array_Push($response, $elements);
    }
1
Poly

Я знаю, что это довольно старый ответ. Вот более быстрое решение без использования 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
Akintunde-Rotimi

Если вам нужно выполнить строковые манипуляции с элементами массива, например, тогда использование функции обратного вызова 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: "FirstName"
1: «Фамилия» 

$tbl = "Employees"

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

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

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


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

0
Greg Bologna

Разве нормальный foreach в принципе не даст такой же результат, как mysql_fetch_assoc в вашем случае?

при использовании foreach для этого массива вы получите массив, содержащий эти три ключа: «id», «firstname» и «lastname».

Это должно быть так же, как mysql_fetch_assoc (в цикле) для каждой строки.

0
Yhn
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]')");
}
0
endip