具有多维数组的php foreach
Posted
技术标签:
【中文标题】具有多维数组的php foreach【英文标题】:php foreach with multidimensional array 【发布时间】:2011-09-18 19:21:52 【问题描述】:我正在开发一个使用数据库类来查询 mysql 的 php 应用程序。
课程在这里:http://net.tutsplus.com/tutorials/php/real-world-oop-with-php-and-mysql/
我对课程进行了一些调整以满足我的需要,但是有一个问题(可能是一个愚蠢的问题)
当使用 select() 时,它会返回一个多维数组,类似于具有 3 个列(id、firstname、lastname)的表:
大批 ( [0] => 数组 ( [id] => 1 [名字] => 名字之一 [姓氏] => 姓氏之一 ) [1] => 数组 ( [id] => 2 [名字] => 名字二 [姓氏] => 姓氏二 ) [2] => 数组 ( [id] => 3 [名字] => 名字三 [姓氏] => 姓氏三 ) )现在我想将此数组用作 mysql 结果 (mysql_fetch_assoc)。
我知道它可以与 foreach() 一起使用,但这是与简单数组一起使用的。所以我认为我必须在每个 foreach() 中重新声明一个新的 foreach(),但我认为这可能会减慢或导致更高的服务器负载。
那么如何以最简单的方式对这个多维数组应用foreach()呢?
谢谢
【问题讨论】:
为什么需要第二个foreach
?您只需使用一个循环即可准备好所有变量,您可以简单地以$value['id']
等方式访问它们。
【参考方案1】:
如果您需要对数组元素进行字符串操作,例如,使用回调函数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 = [];
$fields 中的数据: 0:“名字” 1:“姓氏”
$tbl = "Employees"
array_walk($fields, 'prefixOnArray', $tbl.".");
function prefixOnArray(&$value, $key, $prefix)
$value = $prefix.$value;
结果: “Employees.FirstName” “员工。姓氏”
我很想知道 foreach 的性能是否存在问题,但对于包含少量元素的数组,恕我直言,几乎不值得考虑。
【讨论】:
【参考方案2】:我知道这是一个相当古老的答案。
这是不使用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'));
【讨论】:
【参考方案3】:你好/你好, 我得到了它!您可以轻松获取文件名,tmp_name,file_size等。所以我将向您展示如何通过一行代码获取文件名。
for ($i = 0 ; $i < count($files['name']); $i++)
echo $files['name'][$i].'<br/>';
在我的电脑上测试过。
【讨论】:
【参考方案4】:一旦你的数组就位,要从多维数组中的每个值中获取细节是非常简单的。所以这是数组:
$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|
【讨论】:
【参考方案5】:使用 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>";
【讨论】:
【参考方案6】:理想情况下,多维数组通常是一个数组数组,所以我想声明一个空数组,然后从 db 结果创建一个单独的数组中的键和值对,最后将迭代创建的每个数组推入外部数组。如果这是一个单独的函数调用,您可以返回外部数组。希望有帮助
$response = array();
foreach ($res as $result)
$elements = array("firstname" => $result[0], "subject_name" => $result[1]);
array_push($response, $elements);
【讨论】:
关于为什么这是一个答案可能会有所帮助。 好吧 Popo,理想情况下,多维数组通常是一个数组数组,所以我想声明一个空数组,然后从 db 结果创建一个单独的数组中的键和值对,最后推送创建的每个数组迭代到外部数组。如果这是一个单独的函数调用,您可以返回外部数组。希望有帮助【参考方案7】:这本来是布拉德回答下的评论,但我没有足够高的声誉。
最近我发现我也需要多维数组的键,即在foreach循环中,它不仅仅是数组的索引。
为了实现这一点,您可以使用与接受的答案非常相似的东西,而是将键和值拆分如下
foreach ($mda as $mdaKey => $mdaData)
echo $mdaKey . ": " . $mdaData["value"];
希望对某人有所帮助。
【讨论】:
【参考方案8】: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]')");
【讨论】:
这不安全!在 SQL 查询中使用之前,您必须转义数据。最好的解决方案是使用准备好的/参数化的查询。 移至 PDO。如果根据规范使用“准备”语句,则不需要清理 SQL。这是一个例子。 $sql = "SELECT firstName, lastName from tbl where id = :id"; $pdo = PDO_Reference(); $stmt = $pdo->prepare($sql); $stmt->execute([':id' => $id]);【参考方案9】:你可以使用array_walk_recursive
:
array_walk_recursive($array, function ($item, $key)
echo "$key holds $item\n";
);
【讨论】:
你为什么要在 foreach 上做这个?好像是在浪费内存,为每次迭代定义匿名函数。 @Brad,在这种情况下,我不喜欢它而不是 foreach,我只是想展示一个替代方案。顺便说一句,我认为它不会浪费太多内存,我认为 PHP 只定义了一次这个函数,但每次迭代都会调用它。 问题要求使用foreach
。但我认为这更方便,因为如果您在数组中添加元素(例如,您添加了age
),您不必更改array_walk_recursive
功能【参考方案10】:
以mysql_fetch_assoc()
为例:
while ($row = mysql_fetch_assoc($result))
/* ... your stuff ...*/
在您使用foreach
的情况下,使用从select()
获得的$result
数组:
foreach ($result as $row)
/* ... your stuff ...*/
这很像,只是有适当的迭代。
【讨论】:
【参考方案11】:你可以在这里使用 foreach 就好了。
foreach ($rows as $row)
echo $row['id'];
echo $row['firstname'];
echo $row['lastname'];
我认为您习惯于使用数字索引(例如$row[0]
)访问数据,但这不是必需的。我们可以使用associative arrays 来获取我们想要的数据。
【讨论】:
我没有得到每个索引的第一个索引。你能帮我解决这个问题吗? @SarveshTiwari 发布一个新问题。【参考方案12】:在您的情况下,普通的 foreach 基本上不会产生与 mysql_fetch_assoc 相同的结果吗?
在该数组上使用 foreach 时,您会得到一个包含这三个键的数组:'id'、'firstname' 和 'lastname'。
这应该与 mysql_fetch_assoc 为每一行给出(在循环中)相同。
【讨论】:
确实如此,但正如我所说的数组是多维的,我不知道如何像 foreach( $array as $key => $value ) 那样循环遍历它 在您的代码中,它看起来像这样:foreach ($array as $row) echo $row['id'] . ": " . $row['firstname'] . ", " . $row['lastname'];
这将产生三行,显示结果的 ID、名字和姓氏 :)。如果你想动态循环所有键+值,你几乎需要另一个 foreach。然而;通常你写查询,所以你会知道结果,对吧?以上是关于具有多维数组的php foreach的主要内容,如果未能解决你的问题,请参考以下文章
具有多维数组的 Foreach - Laravel Blade 模板