【问题标题】:php foreach with multidimensional array具有多维数组的php foreach
【发布时间】: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'] 等方式访问它们。

标签: php arrays foreach


【解决方案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。然而;通常你写查询,所以你会知道结果,对吧?
                猜你喜欢
                • 2017-10-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-08-10
                • 2015-08-13
                • 2012-05-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多