好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>后端语言>PHP
<tfoot draggable='sEl'></tfoot>

php数组映射 php 数组

很多站长朋友们都不太清楚php数组映射,今天小编就来给大家整理php数组映射,希望对各位有所帮助,具体内容如下:

本文目录一览: 1、 php如何给关联数组添加新的key元素 2、 PHP 数组的底层实现 3、 php两个数组,相互映射 4、 php中多维数组的问题 php如何给关联数组添加新的key元素

PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。可以把它当成真正的数组、列表(向量)、散列表(是映射的一种实现)、字典、集合、栈、队列以及更多可能性。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。

php 数组的元素是可变化的,可以使用多种方式向php数组中添加元素:

1、在数组末尾添加元素 array[] = value; 或者为key元素赋值的方式 array[key] = value;

2、把一个数组添加到数组中 : array_push;

3、用给定的值填充数组 : array_fill。

PHP 数组的底层实现

PHP 数组的底层主要是通过 HashTable 实现,HashTable 通过映射函数或者散列函数将 String Key 转换成一个普通的数字下标,然后再将 Value 值存储到下标对应的数组元素中

HashTable 主要包含两部分:1.存储元素的数组 2.散列函数或者映射函数

随机访问

如果我们指定一个 Key=>Value 的映射关系,Key 是一个 String 类型的,则先通过 Time 33 算法将 String 转换成一个 Int 整型,然后再通过 PHP 里面特定的散列算法映射成 Bucket 数组中的一个下标,将 Value 值存储到对应的下标元素中,当我们通过 Key 访问数组元素时,只需要再通过相同的算法计算出对应的 Key,就能实现随机访问数组元素

顺序访问

存储在 HashTable 中的数组是无序的,但是 PHP 中的数组是有序的,为了实现 HashTable 的有序性,PHP 引入了一个中间映射表,该表是一个大小和 Bucket 数组相同的数组,数组中存放的是整形数据,主要用于存放元素实际存储的 Value 的下标值,当引入中间映射表之后,Bucket 中的数据是有序的,而中间映射表中的数据是无序的,当我们顺序访问的时候只需要遍历 Bucket 中的数据即可

Hash 冲突

PHP 解决 Hash 冲突采用的是链地址法,将出现冲突的 Bucket 串成链表,这样通过中间映射表映射出来的就不再是一个元素而是一个链表,通过散列函数定位到对应的 Bucket 链表时,需要遍历链表,逐个对比 key 值,直至找出对应的目标值

PHP 实现扩容

1.当删除的元素所占比例超出阈值的时候,则需要移除已经被逻辑删除的 Bucket,将后面的 Bucket 补位到前面,因为 Bucket 的下标发生了变动,所以需要更新每元素在中间映射表中实际存储的下标值

2.当没有超出阈值的时候,PHP 会申请一个大小是原来两倍的新数组,并将旧数组中的数据复制到新数组中,因为数组长度发生了变化,所以 key->value 的映射关系需要重新计算,这个就是重建索引

php两个数组,相互映射

$total=array();

foreach($a as $v){

foreach($b as $v1){

$total[]=array($v,$v1);

}

}

应该这样吧

php中多维数组的问题

"Griffin"=>array()

表示索引"Griffin"是一个数组。=>可以简单理解为赋值。这是php里特有的一种写法。

数组分为2种,一种是自动索引数组。比如

$x=array ("Peter","Lois", "Megan");

那么$X[0]值为"peter",$X[1]为lois。

还有一种是自定义索引数组。

比如

$x=array ("father"=>"Peter","mother"=>"Lois","son"=> "Megan");

那么$x["father"] 就为"peter"

用引号围起来表示这是一个索引字符串值。通常情况下你直接[Griffin]也可以。

但是如果你在系统里有一个变量

$Griffin="son";

那么$families[Griffin]实际上会等于$families['son']。所以最好用引号围起来。

更多详细可以看php手册数组一章。

==========================================================

数组

PHP 中的 数组 实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。数组元素的值也可以是另一个数组。树形结构和多维数组也是允许的。

解释这些结构超出了本手册的范围,但对于每种结构至少会提供一个例子。要得到这些结构的更多信息,建议参考有关此广阔主题的其它著作。

语法

定义数组 array()

可以用 array() 语言结构来新建一个 array。它接受任意数量用逗号分隔的 键(key) => 值(value) 对。

array( key => value

, ...

)

// 键(key) 可是是一个 整数(integer) 或 字符串(string)

// 值(value) 可以是任意类型的值<?php

$arr = array("foo" => "bar", 12 => true);

echo $arr["foo"]; // bar

echo $arr[12]; // 1

?>

key 可以是 integer 或者 string。如果key是一个 integer 的标准表示,则被解释为整数(例如 "8" 将被解释为 8,而 "08" 将被解释为 "08")。key 中的浮点数被取整为 integer。在 PHP 中索引数组与关联 数组 是相同的,它们都可以同时包含 整型 和 字符串 的下标。

值可以是任意的 PHP 类型。

<?php

$arr = array("somearray" => array(6 => 5, 13 => 9, "a" => 42));

echo $arr["somearray"][6]; // 5

echo $arr["somearray"][13]; // 9

echo $arr["somearray"]["a"]; // 42

?>

如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。

<?php

// 这个数组与下面的数组相同 ...

array(5 => 43, 32, 56, "b" => 12);

// ...

array(5 => 43, 6 => 32, 7 => 56, "b" => 12);

?>

Warning

自 PHP 4.3.0 起,上述的索引生成方法改变了。如今如果给一个当前最大键名是负值的数组添加一个新值,则新生成的的索引将为零(0)。以前新生成的索引为当前最大索引加一,和正值的索引相同。

使用 TRUE 作为键名将使 integer 1 成为键名。使用 FALSE 作为键名将使 integer 0 成为键名。使用 NULL 作为键名将等同于使用空字符串。使用空字符串作为键名将新建(或覆盖)一个用空字符串作为键名的值,这和用空的方括号不一样。

不能用数组和对象作为键(key)。这样做会导致一个警告:Illegal offset type。

用方括号的语法新建/修改

可以通过明示地设定值来改变一个现有的数组。

这是通过在方括号内指定键名来给数组赋值实现的。也可以省略键名,在这种情况下给变量名加上一对空的方括号(“[]”)。

$arr[key] = value;

$arr[] = value;

// key 可以是 integer 或 string

// value 可以是任意类型的值如果 $arr 还不存在,将会新建一个。这也是一种定义数组的替换方法。要改变一个值,只要给它赋一个新值。如果要删除一个键名/值对,要对它用 unset()。

<?php

$arr = array(5 => 1, 12 => 2);

$arr[] = 56; // This is the same as $arr[13] = 56;

// at this point of the script

$arr["x"] = 42; // This adds a new element to

// the array with key "x"

unset($arr[5]); // This removes the element from the array

unset($arr); // This deletes the whole array

?>

Note:

如上所述,如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值 + 1。如果当前还没有整数索引,则键名将为 0。如果指定的键名已经有值了,该值将被覆盖。

注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:

<?php

// 创建一个简单的数组

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

print_r($array);

// 现在删除其中的所有元素,但保持数组本身不变:

foreach ($array as $i => $value) {

unset($array[$i]);

}

print_r($array);

// 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)

$array[] = 6;

print_r($array);

// 重新索引:

$array = array_values($array);

$array[] = 7;

print_r($array);

?>

以上例程会输出:

Array

(

[0] => 1

[1] => 2

[2] => 3

[3] => 4

[4] => 5

)

Array

(

)

Array

(

[5] => 6

)

Array

(

[0] => 6

[1] => 7

)

实用函数

有很多操作数组的函数,参见数组函数一节。

Note:

unset() 函数允许删除数组中的某个键。但要注意数组将不会重建索引。 If a true "remove and shift" behavior is desired, the array can be reindexed using the array_values() function.

<?php

$a = array(1 => 'one', 2 => 'two', 3 => 'three');

unset($a[2]);

/* will produce an array that would have been defined as

$a = array(1 => 'one', 3 => 'three');

and NOT

$a = array(1 => 'one', 2 =>'three');

*/

$b = array_values($a);

// Now $b is array(0 => 'one', 1 =>'three')

?>

foreach 控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。

数组做什么和不做什么

为什么 $foo[bar] 错了?

应该始终在用字符串表示的数组索引上加上引号。例如用 $foo['bar'] 而不是 $foo[bar]。但是为什么 $foo[bar] 错了呢?可能在老的脚本中见过如下语法:

<?php

$foo[bar] = 'enemy';

echo $foo[bar];

// etc

?>

这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为 bar,PHP 将把它替代为 'bar' 并使用之。

Note: 这并不意味着总是给键名加上引号。用不着给键名为常量或变量的加上引号,否则会使 PHP 不能解析它们。

<?php

error_reporting(E_ALL);

ini_set('display_errors', true);

ini_set('html_errors', false);

// Simple array:

$array = array(1, 2);

$count = count($array);

for ($i = 0; $i < $count; $i++) {

echo "\nChecking $i: \n";

echo "Bad: " . $array['$i'] . "\n";

echo "Good: " . $array[$i] . "\n";

echo "Bad: {$array['$i']}\n";

echo "Good: {$array[$i]}\n";

}

?>

以上例程会输出:

Checking 0:

Notice: Undefined index: $i in /path/to/script.html on line 9

Bad:

Good: 1

Notice: Undefined index: $i in /path/to/script.html on line 11

Bad:

Good: 1

Checking 1:

Notice: Undefined index: $i in /path/to/script.html on line 9

Bad:

Good: 2

Notice: Undefined index: $i in /path/to/script.html on line 11

Bad:

Good: 2

演示此行为的更多例子:

<?php

// Show all errors

error_reporting(E_ALL);

$arr = array('fruit' => 'apple', 'veggie' => 'carrot');

// Correct

print $arr['fruit']; // apple

print $arr['veggie']; // carrot

// Incorrect. This works but also throws a PHP error of level E_NOTICE because

// of an undefined constant named fruit

//

// Notice: Use of undefined constant fruit - assumed 'fruit' in...

print $arr[fruit]; // apple

// This defines a constant to demonstrate what's going on. The value 'veggie'

// is assigned to a constant named fruit.

define('fruit', 'veggie');

// Notice the difference now

print $arr['fruit']; // apple

print $arr[fruit]; // carrot

// The following is okay, as it's inside a string. Constants are not looked for

// within strings, so no E_NOTICE occurs here

print "Hello $arr[fruit]"; // Hello apple

// With one exception: braces surrounding arrays within strings allows constants

// to be interpreted

print "Hello {$arr[fruit]}"; // Hello carrot

print "Hello {$arr['fruit']}"; // Hello apple

// This will not work, and will result in a parse error, such as:

// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'

// This of course applies to using superglobals in strings as well

print "Hello $arr['fruit']";

print "Hello $_GET['foo']";

// Concatenation is another option

print "Hello " . $arr['fruit']; // Hello apple

?>

当打开 error_reporting 来显示 E_NOTICE 级别的错误(例如将其设为 E_ALL)时将看到这些错误。默认情况下 error_reporting 被关闭不显示这些。

和在语法一节中规定的一样,在方括号(“[”和“]”)之间必须有一个表达式。这意味着可以这样写:

<?php

echo $arr[somefunc($bar)];

?>

这是一个用函数返回值作为数组索引的例子。PHP 也可以用已知常量,可能之前已经见过

<?php

$error_descriptions[E_ERROR] = "A fatal error has occured";

$error_descriptions[E_WARNING] = "PHP issued a warning";

$error_descriptions[E_NOTICE] = "This is just an informal notice";

?>

注意 E_ERROR 也是个合法的标识符,就和第一个例子中的 bar 一样。但是上一个例子实际上和如下写法是一样的:

<?php

$error_descriptions[1] = "A fatal error has occured";

$error_descriptions[2] = "PHP issued a warning";

$error_descriptions[8] = "This is just an informal notice";

?>

因为 E_ERROR 等于 1, 等等.

那么为什么这样做不好?

也许有一天,PHP 开发小组可能会想新增一个常量或者关键字,或者用户可能希望以后在自己的程序中引入新的常量,那就有麻烦了。例如已经不能这样用 empty 和 default 这两个词了,因为他们是保留字。

Note: 重申一次,在双引号字符串中,不给索引加上引号是合法的因此 "$foo[bar]"是合法的(“合法”的原文为valid。在实际测试中,这么做确实可以访问数组的该元素,但是会报一个常量未定义的notice。无论如何,强烈建议不要使用$foo[bar]这样的写法,而要使用$foo['bar']来访问数组中元素。--haohappy注)。至于为什么参见以上的例子和字符串中的变量解析中的解释。

转换为数组

对于任意类型: integer, float, string, boolean and resource,如果将一个值转换为数组,将得到一个仅有一个元素的数组(其下标为 0),该元素即为此标量的值。换句话说, (array)$scalarValue 与 array($scalarValue) 完全一样。

If an object is converted to an array, the result is an array whose elements are the object's properties. The keys are the member variable names, with a few notable exceptions: integer properties are unaccessible; private variables have the class name prepended to the variable name; protected variables have a '*' prepended to the variable name. These prepended values have null bytes on either side. This can result in some unexpected behaviour:

<?php

class A {

private $A; // This will become '\0A\0A'

}

class B extends A {

private $A; // This will become '\0B\0A'

public $AA; // This will become 'AA'

}

var_dump((array) new B());

?>

The above will appear to have two keys named 'AA', although one of them is actually named '\0A\0A'.

将 NULL 转换到 数组(array) 会得到一个空的数组。

比较

可能使用 array_diff() 和数组运算符来比较数组。

Examples

PHP 中的数组类型有非常多的用途,因此这里有一些例子展示数组的完整威力。

<?php

// This:

$a = array( 'color' => 'red',

'taste' => 'sweet',

'shape' => 'round',

'name' => 'apple',

4 // key will be 0

);

$b = array('a', 'b', 'c');

// . . .is completely equivalent with this:

$a = array();

$a['color'] = 'red';

$a['taste'] = 'sweet';

$a['shape'] = 'round';

$a['name'] = 'apple';

$a[] = 4; // key will be 0

$b = array();

$b[] = 'a';

$b[] = 'b';

$b[] = 'c';

// After the above code is executed, $a will be the array

// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round',

// 'name' => 'apple', 0 => 4), and $b will be the array

// array(0 => 'a', 1 => 'b', 2 => 'c'), or simply array('a', 'b', 'c').

?>

Example #1 Using array()

<?php

// Array as (property-)map

$map = array( 'version' => 4,

'OS' => 'Linux',

'lang' => 'english',

'short_tags' => true

);

// strictly numerical keys

$array = array( 7,

8,

0,

156,

-10

);

// this is the same as array(0 => 7, 1 => 8, ...)

$switching = array( 10, // key = 0

5 => 6,

3 => 7,

'a' => 4,

11, // key = 6 (maximum of integer-indices was 5)

'8' => 2, // key = 8 (integer!)

'02' => 77, // key = '02'

0 => 12 // the value 10 will be overwritten by 12

);

// empty array

$empty = array();

?>

Example #2 集合

<?php

$colors = array('red', 'blue', 'green', 'yellow');

foreach ($colors as $color) {

echo "Do you like $color?\n";

}

?>

以上例程会输出:

Do you like red?

Do you like blue?

Do you like green?

Do you like yellow?

直接改变数组的值在 PHP 5 中可以通过引用传递来做到。之前的版本需要需要采取变通的方法:

Example #3 集合

<?php

// PHP 5

foreach ($colors as $color) {

$color = strtoupper($color);

}

unset($color); /* ensure that following writes to

$color will not modify the last array element */

// Workaround for older versions

foreach ($colors as $key => $color) {

$colors[$key] = strtoupper($color);

}

print_r($colors);

?>

以上例程会输出:

Array

(

[0] => RED

[1] => BLUE

[2] => GREEN

[3] => YELLOW

)

本例生成一个下标从1开始的数组。This example creates a one-based array.

Example #4 下标从1开始的数组

<?php

$firstquarter = array(1 => 'January', 'February', 'March');

print_r($firstquarter);

?>

以上例程会输出:

Array

(

[1] => 'January'

[2] => 'February'

[3] => 'March'

)

Example #5 填充数组

<?php

// fill an array with all items from a directory

$handle = opendir('.');

while (false !== ($file = readdir($handle))) {

$files[] = $file;

}

closedir($handle);

?>

数组是有序的。也可以使用不同的排序函数来改变顺序。更多信息参见数组函数。可以用 count() 函数来数出数组中元素的个数。

Example #6 数组排序

<?php

sort($files);

print_r($files);

?>

因为数组中的值可以为任意值,也可是另一个数组。这样可以产生递归或多维数组。

Example #7 递归和多维数组

<?php

$fruits = array ( "fruits" => array ( "a" => "orange",

"b" => "banana",

"c" => "apple"

),

"numbers" => array ( 1,

2,

3,

4,

5,

6

),

"holes" => array ( "first",

5 => "second",

"third"

)

);

// Some examples to address values in the array above

echo $fruits["holes"][5]; // prints "second"

echo $fruits["fruits"]["a"]; // prints "orange"

unset($fruits["holes"][0]); // remove "first"

// Create a new multi-dimensional array

$juices["apple"]["green"] = "good";

?>

数组(Array) 的赋值总是会涉及到值的拷贝。使用 引用操作符 通过引用来拷贝数组。

<?php

$arr1 = array(2, 3);

$arr2 = $arr1;

$arr2[] = 4; // $arr2 is changed,

// $arr1 is still array(2, 3)

$arr3 = $arr1;

$arr3[] = 4; // now $arr1 and $arr3 are the same

?>

关于php数组映射的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。

查看更多关于php数组映射 php 数组的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did225962
更新时间:2023-05-11   阅读:31次

上一篇: php操作kafka php操作数据库实验心得

下一篇:设置图片格式php 设置图片格式中线条颜色选项为实线

相关资讯

最新资料更新

  • 1.php下载表格 php下载功能
  • 2.php文字合到图片 php 图片合成
  • 3.iconv函数php iconv函数参数
  • 4.十荟团php开发怎么样 十荟团内部人士真实感受
  • 5.phpsql过滤类 php过滤器
  • 6.PHP添加日期代码 php年月日时间代码
  • 7.phprsa密钥拼接 rsa加密解密
  • 8.PHP安装宽带办理 php网站安装
  • 9.php在线直播详解 php直播用的什么技术
  • 10.php批量取中间 php批量删除数据
  • 11.php接收url php接收json数据
  • 12.erpphp源码下载 thinkphp erp源码
  • 13.phpajax日历 php如何生成一年的日历
  • 14.php压缩上传的图片 php上传图片文件
  • 15.phpflv播放器 php视频播放
  • 16.linux中下载php linux安装php56
  • 17.php登录和注册 php登录和注册不使用数据库
  • 18.php图书管理系统 php图书管理系统全部代码
  • 19.php短信android Php短信对接视频
  • 20.php手机qr php手机编程软件

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://www.haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网」
[ SiteMap ]