具有多维数组的php foreach

Posted

技术标签:

【中文标题】具有多维数组的php foreach【英文标题】:php foreach with multidimensional array 【发布时间】:2011-09-18 19:21:52 【问题描述】:

我正在开发一个使用数据库类来查询 mysqlphp 应用程序。

课程在这里: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的主要内容,如果未能解决你的问题,请参考以下文章

PHP:使用 foreach 从多维数组中删除元素(按键)

具有多维数组的 Foreach - Laravel Blade 模板

PHP foreach循环遍历多维数组

php多维数组化一维数组

如何使用php在foreach循环中获取多维数组的键? [复制]

Php多维数组与混合for和Foreach循环