如何在PHP中最容易地声明二维数组?

时间:2009-11-28 00:20:23

标签: php arrays

喜欢:

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

14 个答案:

答案 0 :(得分:77)

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

$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';

答案 1 :(得分:63)

以下是等效的,并产生二维数组:

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

$array = array();

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

答案 2 :(得分:35)

刚刚申报?你不必。只需确保变量存在:

$d = array();

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

$d[1][2] = 3;

这适用于任何数量的维度而无需事先声明。

答案 3 :(得分:26)

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

其次,您可以编写一个能够执行此操作的函数:

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

答案 4 :(得分:11)

对于一个简单的“随时随地填充”的解决方案:

$foo = array(array());

这将为您提供一个灵活的伪二维数组,可以保存$ foo [ n ] [ n ],其中 n < = ∞(当然你受限于通常的内存大小限制,但你得到了我希望的想法)。理论上,这可以扩展为根据需要创建任意数量的子阵列。

答案 5 :(得分:8)

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

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

将创建一个$m$n数组,其中所有内容都设置为$value

答案 6 :(得分:2)

据我所知,没有内置的php函数来执行此操作,您需要通过循环或自定义方法来执行此操作,该方法通过@Amber递归调用类似于array_fill的内容; < / p>

我假设你的意思是创建一个空的但初始化的数组数组。例如,您需要最终结果,如下面的 3阵列数组

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

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

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

...等...

我感到沮丧。如果有一个简单的方法可以在不检查或抛出错误的情况下声明任何深度的数组的初始化数组,那将是很好的。

答案 7 :(得分:2)

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

例如,如果$ a [6] [9]未填充,则相当于$ a [6] [9],例如使用&#34;&#34;或者0。

答案 8 :(得分:2)

$r = array("arr1","arr2");

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

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

输出为:arr1 arr2

答案 9 :(得分:0)

我喜欢这种方式:

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

答案 10 :(得分:0)

如果您想使用一根衬纸快速创建简单值的多维数组,我建议使用此discriminators来做到这一点:

import React from 'react';
import { shallow } from 'enzyme';
import Square from '../components/Square/Square';

describe('<Square />', () => {
   let wrapper;

   beforeEach(() => {
      wrapper = shallow(<Square color={undefined} />); // Here it's not necessary to mock the clickSquare function.
   });

   it('should render the value of color', () => {
      wrapper.setProps({ color: undefined });
      wrapper.find('div').simulate('click'); // Simulating a click event.

      expect(wrapper.state('color')).toEqual('transparent');
   });
});

将产生

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

答案 11 :(得分:0)

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

library(plotly)
library(shiny)
library(htmlwidgets)
library(colourpicker)


ui <- fluidPage(
  fluidRow(
     column(8,
           plotlyOutput("plot1")
    ),
    column(2,
                   colourpicker::colourInput(inputId = 'markercolor', label = 'X',
           palette = "limited", 
           showColour = "background", returnName = TRUE),
           selectInput(inputId = 'traceNo', label = 'Trace', choices = c(1:3), selected = 1),
           br(),
           h5('Switch'),
           actionButton(inputId = 'Switch', label = icon('refresh'), style = "color: #f7ad6e;   background-color: white;  border-color: #f7ad6e;
                        height: 40px; width: 40px; border-radius: 6px;  border-width: 2px; text-align: center;  line-height: 50%; padding: 0px; display:block; margin: 2px")
    )
  )
)

server <- function(input, output, session) {
  # values <- reactiveValues()


  observeEvent(input$Switch, { 
    plotlyProxy("plot1", session) %>%
      plotlyProxyInvoke("restyle", list(marker = list(color = input$markercolor)), list(as.numeric(input$traceNo)-1))
    })

  output$plot1 <- renderPlotly({
    markersize <- 4
    markerlegendsize <- 20
   colors <- c('red', 'blue', 'black')
    p1 <- plot_ly()
    p1 <-  add_trace(p1, data = mtcars, x = ~disp, y = ~mpg, type = 'scatter', mode = 'markers', color = ~as.factor(cyl), colors = colors)
    p1 <- layout(p1, title = 'mtcars group by cyl with switching colors')
    p1 <- plotly_build(p1)

    ## this is a bit of a hack to change the size of the legend markers to not be equal to the plot marker size. 
    ## it makes a list of 1 size value for each marker in de trace in the plot, and another half of with sizes that are a lot bigger.
    ## the legend marker size is effectively the average size of all markers of a trace
    for(i in seq(1, length(sort(unique(mtcars$cyl) )))) {
      length.group <- nrow(mtcars[which(mtcars$cyl  == sort(unique(mtcars$cyl))[i]), ])
      p1$x$data[[i]]$marker$size <- c(rep(markersize,length.group), rep(c(-markersize+2*markerlegendsize), length.group))
    }
    p1
  })
}

shinyApp(ui, server)

输出:

$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++;
    }
}

答案 12 :(得分:0)

您可以尝试这样做,但是第二维值将等于索引:

public List<CarPrototype> allPrototypes() { List<CarPrototype> prototypes = catalog.values().stream() .flatMap(List::stream) .collect(Collectors.toList()); return prototypes; }

对于空数组要复杂一些:

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

答案 13 :(得分:0)

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

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

示例:

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

要从数组中获取第一项,您将使用$arr[0][0],就像从数组中 first 数组中的第一项一样。 $arr[1][0]将返回数组中 second 数组中的第一项。