【问题标题】:How do I declare a two dimensional array?如何声明一个二维数组?
【发布时间】:2010-12-21 03:10:18
【问题描述】:

创建二维数组的最简单方法是什么。我希望能够做类似的事情:

declare int d[0..m, 0..n]

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    您还可以通过指定数组的索引来创建关联数组或类似“哈希表”的数组。

    $array = array(
        0 => array(
            'name' => 'John Doe',
            'email' => 'john@example.com'
        ),
        1 => array(
            'name' => 'Jane Doe',
            'email' => 'jane@example.com'
        ),
    );
    

    相当于

    $array = array();
    
    $array[0] = array();
    $array[0]['name'] = 'John Doe';
    $array[0]['email'] = 'john@example.com';
    
    $array[1] = array();
    $array[1]['name'] = 'Jane Doe';
    $array[1]['email'] = 'jane@example.com';
    

    【讨论】:

    • 我们如何使用循环语句创建同样的数组?
    • @Anoop-Pete 在第二个 sn-p 中,两个重复块将被放入循环中,并且数字索引被替换为每次迭代递增的变量。
    • @AnoopPete : for ($i=0; $i
    【解决方案2】:

    以下是等价的,结果是一个二维数组:

    $array = array(
        array(0, 1, 2),
        array(3, 4, 5),
    );
    

    $array = array();
    
    $array[] = array(0, 1, 2);
    $array[] = array(3, 4, 5);
    

    【讨论】:

    • 那些不会产生二维数组,而是产生数组数组。
    • @dotancohen 这只是语义,真的。实际上,这两个概念是相同的。此处演示的内容与 C# 等语言中使用的多维数组类型之间的唯一区别是语法。并且在语法上有相当小的差异。
    • 至少在 C# 中,内存要求是不同的。数组数组仅分配每个数组所需的内存量。一个二维数组分配了整个 N * M 的内存。
    • @dotancohen PHP 和 C# 之间的内存需求通常非常不同,因为每种语言的运行时都有自己的内存处理方式。在实践中,这通常不是您关心的问题。除非您碰巧正在构建某种长时间运行的高性能应用程序,例如游戏,在这种情况下 PHP 将是一种奇怪的语言选择。
    【解决方案3】:

    只是声明?你不必。只要确保变量存在:

    $d = array();
    

    动态调整数组大小,并尝试将任何内容写入不存在的元素创建它(并在需要时创建整个数组)

    $d[1][2] = 3;
    

    这对没有事先声明的任意数量的维度都有效。

    【讨论】:

    • 除了没有告诉你尺寸。如果您要声明一个 M x N 2D 数组,那么它很可能是一个矩阵,如果它是一个矩阵,那么您可能会在其上进行乘法或某些需要迭代元素的操作,如果是“稀疏”并且不知道尺寸。
    • @cletus:你可以在正确的维度上使用count,例如count($d[1]),除非我误解了你的意思?
    • 不过,PHP 没有多维数组。数组数组可能是稀疏的,这种可能性总是存在的。那么,如何创建一个使用数组实现矩阵的类,至少这样你会更加注意正确的实现。
    【解决方案4】:

    首先,PHP 没有多维数组,它有数组的数组。

    其次,您可以编写一个函数来完成它:

    function declare($m, $n, $value = 0) {
      return array_fill(0, $m, array_fill(0, $n, $value));
    }
    

    【讨论】:

    • 你的意思不是“数组of数组”,而不是“数组数组”吗?
    • @Asaph:是的,我做到了。固定的。谢谢。
    • 设置一个零数组是完全没有意义的练习。不需要声明数组,直接使用即可。
    • 除非您需要对其进行迭代或确定它的大小,就像您说要进行矩阵乘法一样。填充数组值有一个完全有效的情况。
    【解决方案5】:

    对于一种简单的“随用随充”的解决方案:

    $foo = array(array());

    这将为您提供一个灵活的伪二维数组,可以容纳 $foo[n][n] 其中 n

    【讨论】:

      【解决方案6】:

      或者对于更大的数组,都具有相同的值:

      $m_by_n_array = array_fill(0, $n, array_fill(0, $m, $value);
      

      将通过$n 创建一个$m 数组,并将所有内容设置为$value

      【讨论】:

        【解决方案7】:

        atli 的回答确实帮助我理解了这一点。这是一个如何遍历二维数组的示例。此示例展示了如何查找已知数组名称的值,以及一个 foreach,您只需在其中查找您在其中找到的所有字段。我希望它可以帮助某人。

        $array = array(
            0 => array(
                'name' => 'John Doe',
                'email' => 'john@example.com'
            ),
            1 => array(
                'name' => 'Jane Doe',
                'email' => 'jane@example.com'
            ),
        );
        
        foreach ( $array  as $groupid => $fields) {
            echo "hi element ". $groupid . "\n";
            echo ". name is ". $fields['name'] . "\n";
            echo ". email is ". $fields['email'] . "\n";
            $i = 0;
            foreach ($fields as $field) {
                 echo ". field $i is ".$field . "\n";
                $i++;
            }
        }
        

        输出:

        hi element 0
        . name is John Doe
        . email is john@example.com
        . field 0 is John Doe
        . field 1 is john@example.com
        hi element 1
        . name is Jane Doe
        . email is jane@example.com
        . field 0 is Jane Doe
        . field 1 is jane@example.com
        

        【讨论】:

          【解决方案8】:

          据我所知,没有内置的 php 函数可以执行此操作,您需要通过循环或自定义方法来执行此操作,该方法递归调用 @Amber 在答案中指示的 array_fill 之类的东西;

          我假设您的意思是创建了一个空但已初始化的数组数组。例如,您想要一个类似于下面的 3 个数组的数组的最终结果:

             $final_array = array(array(), array(), array());
          

          这很简单,只需手动编写代码,但对于任意大小的数组,如 3 个数组的 3 个数组的数组,在使用前初始化变得复杂:

               $final_array = array(array(array(), array(), array()), array(array(), array(), array()), array(array(), array(), array()));
          

          ...等等...

          我感到沮丧。最好有一种简单的方法来声明一个已初始化的数组数组,可以使用任意深度而无需检查或抛出错误。

          【讨论】:

            【解决方案9】:

            对我来说,关于数组是否应该稀疏的争论取决于上下文。

            例如,如果 $a[6][9] 未填充,则等效于 $a[6][9] 被填充例如“”或 0。

            【讨论】:

              【解决方案10】:
              $r = array("arr1","arr2");
              

              要回显你应该编写的单个数组元素:

              echo $r[0];
              echo $r[1];
              

              输出将是:arr1 arr2

              【讨论】:

              • 这是一个一维数组。一个多维数组至少有一个数组中的一个数组。
              【解决方案11】:

              我喜欢这种方式:

              $cars = array
                (
                array("Volvo",22),
                array("BMW",15),
                array("Saab",5),
                array("Land Rover",17)
                );
              

              【讨论】:

                【解决方案12】:

                如果您想使用一个衬垫快速创建简单值的多维数组,我建议您使用此array library 来执行此操作:

                $array = Arr::setNestedElement([], '1.2.3', 'value');
                

                会产生

                [
                  1 => [
                    2 => [
                      3 => 'value'
                    ]
                  ]
                ]
                

                【讨论】:

                  【解决方案13】:

                  你可以试试这个,但是第二维值将等于索引:

                  $array = array_fill_keys(range(0,5), range(0,5));

                  空数组稍微复杂一点:

                  $array = array_fill_keys(range(0, 5), array_fill_keys(range(0, 5), null));

                  【讨论】:

                    【解决方案14】:

                    你需要在另一个数组中声明一个数组。

                    $arr = array(array(content), array(content));

                    例子:

                    $arr = array(array(1,2,3), array(4,5,6));

                    要从数组中获取第一项,您将使用$arr[0][0],这类似于数组中first 数组中的第一项。 $arr[1][0] 将返回数组中 second 数组中的第一项。

                    【讨论】:

                      猜你喜欢
                      • 2022-01-15
                      • 1970-01-01
                      • 2012-02-27
                      • 2018-06-29
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2019-09-25
                      • 2014-03-03
                      相关资源
                      最近更新 更多