Php 阵列部件访问

Php 阵列部件访问,php,Php,我正在努力更好地理解数组。请原谅我的基本问题,因为我三周前刚刚打开了我的第一本php书 我知道您可以使用foreach(或for循环)检索键/值对,如下所示 $stockprices= array("Google"=>"800", "Apple"=>"400", "Microsoft"=>"4", "RIM"=>"15", "Facebook"=>"30"); foreach ($stockprices as $key =>$price) 我感到困惑

我正在努力更好地理解数组。请原谅我的基本问题,因为我三周前刚刚打开了我的第一本php书

我知道您可以使用foreach(或for循环)检索键/值对,如下所示

 $stockprices= array("Google"=>"800", "Apple"=>"400", "Microsoft"=>"4",  "RIM"=>"15",  "Facebook"=>"30");

foreach ($stockprices as $key =>$price)
我感到困惑的是像这样的多维数组:

$states=(array([0]=>array("capital"=> "Sacramento", "joined_union"=>1850, "population_rank"=> 1),
              [1]=>array("capital"=> "Austin", "joined_union"=>1845,"population_rank"=> 2),
              [2]=>array("capital"=> "Boston", "joined_union"=>1788,"population_rank"=> 14)
              ));
我的第一个问题是非常基本的:我知道“资本”、“联合”、“人口等级”是关键,“萨克拉门托”、“1850”、“1”是价值观(正确吗?)。但是你怎么称呼[0][1][2]?它们是“主键”和“资本”等子键吗?我找不到任何关于这些的定义,无论是在书中还是在网上

主要问题是如何检索数组[0][1][2]?假设我想获取1845年加入_union的数组(甚至在19世纪更复杂),然后删除该数组

最后,我可以将数组[0][1][2]相应地命名为加利福尼亚州、德克萨斯州和马萨诸塞州吗

$states=(array("California"=>array("capital"=> "Sacramento", "joined_union"=>1850, "population_rank"=> 1),
              "Texas"=>array("capital"=> "Austin", "joined_union"=>1845,"population_rank"=> 2),
              "Massachusetts"=>array("capital"=> "Boston", "joined_union"=>1788,"population_rank"=> 14)
              ));

1:多维数组基本上是“数组的数组”

因此,如果我们看这里:

array("0"=>array("capital"=> "Sacramento", "joined_union"=>1850, "population_rank"=> 1)
0是键,数组是值

然后,在值内,您将
大写字母
作为键,将
萨克拉门托
作为值

2:用于移除阵列:

3:说明密钥的名称


是的,您可以将0、1、2更改为状态名称。它们将成为键值而不是带编号的数组。这样可以更轻松地完全删除要删除的值。

与其他语言不同,PHP中的数组可以使用数字键或字符串键。您可以选择。 (这不是PHP和其他语言的一个受欢迎的特性,sneer!)

对于查询您拥有的结构,有两种方法
1) 循环

2) 使用该功能:

$joined1850 = array_filter(
    $states,
    function( $state ) {
        return $state['joined_union'] == 1850;
    }
);
print_r( $joined1850 );
/*
Array
(
    [California] => Array
        (
            [capital] => Sacramento
            [joined_union] => 1850
            [population_rank] => 1
        )

)
*/
-

$joined1800s=阵列过滤器(
$states,
功能($state){
返回$state['joined_union']>=1800和$state['joined_union']<1900;
}
);
印刷品(联合1800年代);
/*
排列
(
[加利福尼亚]=>阵列
(
[资本]=>萨克拉门托
[加入工会]=>1850
[人口排名]=>1
)
[Texas]=>阵列
(
[资本]=>奥斯汀
[加入工会]=>1845年
[人口排名]=>2
)
)
*/

多维数组是以数组作为值的简单数组。简单或“标量”“类型是像
int
string
bool
这样的类型,它们只包含一个值和一个值。数组是一种复合类型,这意味着它是一种将其他一些东西组合在一起的东西。数组可以包含其他类型的值,包括数组

最简单的可视化方式可能是:

$array = array('foo' => array('bar' => 'baz'));

$foo = $array['foo']; // $foo is now array('bar' => 'baz')

echo $foo['bar']; // outputs 'baz'
这只是上述内容的简写:

echo $array['foo']['bar'];
$array['foo']
允许您访问值
数组('bar'=>'baz')
,该数组上的
['bar']
允许您访问值
'baz'
。将中间值赋给变量或直接继续都无关紧要

另一方面,这里演示了多维数组只是数组中的数组的概念:

$baz   = 'baz';
$bar   = array('bar' => $baz);
$array = array('foo' => $bar);
就这些

您可以将数组中的嵌套数组称为“子数组”,尽管没有真正的定义,也没有必要定义它,因为嵌套数组不是任何事物的特例


您可能会偶然发现使用术语“二维”、“三维”等数组的解释。不要把它想象成桌子和立方体,因为它不精确,当它超过三维时会让你的头爆炸。这个“维度”简单地指数组的深度,即有多少数组相互嵌套。

更简洁的方法是使用对象。阅读相关内容,您可以避免“数组狂热”。如果您更精确地缩进代码,或者查看。事实上,“主键”或有时“顶级”数组键是常见的名称。下面我的回答是为了帮助您更好地理解数组-这一点很重要。。。从长远来看,我同意@ZombieHunter的观点——数组越复杂,你就越可能想要面向对象。@僵尸对象本身并不干净。多维数组仍然非常有用。如果您能够并且确实为每种数据类型定义了正确封装的自定义类,那么最终您将获得更易于维护的代码,但这并不总是适用的,也不是这里的问题。我不同意“这不是PHP的一个受欢迎的功能”-PHP的“数组”数据类型是该语言最强大的功能之一,并可用于替代各种专用类型(列表、向量、哈希、队列和堆栈、集合、多集合等)@IMSoP,这可能是好事,也可能不是好事;专用类型可以使事情变得更好,就像所有严格的类型安全通常都是好的一样。我同意,但我几乎没听说过有人抱怨PHP的数组类型。@deceze专用类型确实很有用,但您确实需要有一个可以满足您需求的类型。例如,Javascript没有“有序散列”类型(对象可以用作散列,但不要求运行时在循环时以任何特定顺序生成属性)。我知道这是一种观点,但我发现PHP的数组类型和类型系统通常允许一些非常方便的算法-如果小心使用的话。谢谢@meouw!也感谢大家的优秀反馈和回答!Stack很棒,我很高兴能学到更多!选择meouw是因为循环部分。谢谢@deceze的解释,使它不那么复杂和可怕。
$array = array('foo' => array('bar' => 'baz'));

$foo = $array['foo']; // $foo is now array('bar' => 'baz')

echo $foo['bar']; // outputs 'baz'
echo $array['foo']['bar'];
$baz   = 'baz';
$bar   = array('bar' => $baz);
$array = array('foo' => $bar);