Analyser le tableau de types de données PHP (Array)

怪我咯
Libérer: 2023-03-07 10:56:02
original
2780 Les gens l'ont consulté

Le tableau en PHP est en fait une carte ordonnée. Une carte est un type qui associe des valeurs à des clés. Ce type est optimisé de plusieurs manières, il peut donc être traité comme un véritable tableau, ou une liste (vecteur), une table de hachage (une implémentation du mappage), un dictionnaire, un ensemble, une pile, une file d'attente et plus encore. De nombreuses possibilités . Puisque la valeur d'un élément du tableau peut également être un autre tableau, les structures arborescentes et les tableaux multidimensionnels sont également autorisés.

Expliquer ces structures dépasse le cadre de ce manuel, mais au moins un exemple sera fourni pour chaque structure. Pour plus d’informations sur ces structures, il est recommandé de consulter d’autres ouvrages sur ce vaste sujet.

Syntaxe

Définir un tableau array()

Vous pouvez utiliser la structure du langage array() pour créer un nouveau tableau. Il accepte n’importe quel nombre de paires clé => valeur séparées par des virgules.

array( key => value
, ...
)
// la clé peut être un entier ou une chaîne de caractères
// value ) peut être une valeur de n'importe quelle valeur tapez

La virgule après le dernier élément du tableau peut être omise. Habituellement utilisé dans les définitions de tableaux sur une seule ligne, tels que array(1, 2) au lieu de array(1, 2, ). Il est courant de laisser la dernière virgule dans les définitions de tableaux multilignes pour faciliter l'ajout d'une nouvelle cellule.

Depuis la version 5.4, il est possible d'utiliser une syntaxe de définition de tableau courte, en utilisant [] au lieu de array().

Exemple n°1 Un simple tableau

<?php
$array = array(
   "foo" => "bar",
   "bar" => "foo",
);
 
// 自 PHP 5.4 起
$array = [
   "foo" => "bar",
   "bar" => "foo",
];
?>
Copier après la connexion

clé peut être un entier ou une chaîne. la valeur peut être de n’importe quel type.

De plus, la clé aura le casting suivant :

  • Les chaînes contenant des valeurs entières légales seront converties en entiers. Par exemple, le nom de clé « 8 » sera en réalité stocké sous la forme 8. Mais "08" ne sera pas converti car il ne s'agit pas d'une valeur décimale légale.

  • Les nombres à virgule flottante seront également convertis en nombres entiers, ce qui signifie que leurs parties décimales seront arrondies. Par exemple, le nom de clé 8.7 sera en réalité stocké sous 8.

  • Les valeurs booléennes seront également converties en entiers. Autrement dit, le nom de clé true sera en fait stocké sous la valeur 1 et le nom de clé false sera stocké sous la valeur 0.

  • Null sera converti en une chaîne vide, c'est-à-dire que le nom de clé null sera en fait stocké sous "".

  • Les tableaux et les objets ne peuvent pas être utilisés comme clés. Insister pour cela entraînera un avertissement : Type de décalage illégal.

Si plusieurs cellules utilisent le même nom de clé dans la définition du tableau, seule la dernière sera utilisée et les précédentes seront écrasées.

Exemple n°2 : Exemple de coercition et d'écrasement de type

<?php
$array = array(
   1    => "a",
   "1"  => "b",
   1.5  => "c",
   true => "d",
);
var_dump($array);
?>
Copier après la connexion

La routine ci-dessus affichera :

array(1) {
[1]=>
string(1) "d"
}

Dans l'exemple ci-dessus, tous les noms de clés sont forcés à 1, puis chaque nouvelle unité écrasera la valeur précédente, et seulement A "d".

Les tableaux PHP peuvent contenir à la fois des noms de clés entières et de chaîne, car PHP ne fait pas réellement de distinction entre les tableaux indexés et les tableaux associatifs.

Si aucune clé n'est spécifiée pour la valeur donnée, la valeur d'index entière la plus grande actuelle est prise et le nouveau nom de clé sera cette valeur plus un. Si le nom de clé spécifié a déjà une valeur, la valeur sera écrasée.

Exemple n°3 Mélange de noms de clés entières et de chaînes

<?php
$array = array(
   "foo" => "bar",
   "bar" => "foo",
   100   => -100,
   -100  => 100,
);
var_dump($array);
?>
Copier après la connexion

La routine ci-dessus affichera :

array(4) {
["foo"]= >
string(3) "bar"
["bar"]=>
string(3) "foo"
[100]=>
int(-100)
[-100]=>
int(100)
}

la clé est facultative. Si cela n’est pas spécifié, PHP utilisera automatiquement la plus grande clé entière précédemment utilisée plus 1 comme nouvelle clé.

Exemple n°4 Tableau d'index sans nom de clé

<?php
$array = array("foo", "bar", "hallo", "world");
var_dump($array);
?>
Copier après la connexion

La routine ci-dessus affichera :

array(4) {
[0]=> 🎜>string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(5) "bonjour"
[3]=>
string(5) "world"
}

Vous pouvez également spécifier des noms de clé uniquement pour certaines unités et laisser d'autres vides :

Exemple n°5 Spécifiez uniquement les noms de clés pour certaines unités

<?php
$array = array(
        "a",
        "b",
   6 => "c",
        "d",
);
var_dump($array);
?>
Copier après la connexion
La routine ci-dessus affichera :

array(4) {

[0]=>
string(1 ) " a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=> ;
string(1) "d"
}

Vous pouvez voir que la dernière valeur "d" se voit automatiquement attribuer le nom de clé 7. En effet, la clé entière la plus grande précédente était 6.

Utilisez la syntaxe entre crochets pour accéder aux cellules du tableau

Les cellules du tableau sont accessibles via la syntaxe du tableau[clé].

Exemple n°6 Accéder à l'unité de tableau

<?php
$array = array(
   "foo" => "bar",
   42    => 24,
   "multi" => array(
        "dimensional" => array(
            "array" => "foo"
        )
   )
);
 
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>
Copier après la connexion
La routine ci-dessus affichera :

string(3) "bar"

int(24)
string(3) "foo"

Remarque :

Les crochets et les accolades peuvent être utilisés de manière interchangeable pour accéder aux éléments du tableau (par exemple $array[42] et $array{42} dans ce qui précède exemple L'effet est le même).

自 PHP 5.4 起可以用数组间接引用函数或方法调用的结果。之前只能通过一个临时变量。

自 PHP 5.5 起可以用数组间接引用一个数组原型。

Example #7 数组间接引用

<?php
function getArray() {
   return array(1, 2, 3);
}
 
// on PHP 5.4
$secondElement = getArray()[1];
 
// previously
$tmp = getArray();
$secondElement = $tmp[1];
// or
list(, $secondElement) = getArray();
?>
Copier après la connexion

Note:

试图访问一个未定义的数组键名与访问任何未定义变量一样:会导致 E_NOTICE 级别错误信息,其结果为 NULL。

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

可以通过明示地设定其中的值来修改一个已有数组。

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

$arr[key] = value;
$arr[] = value;
// key 可以是 integer 或 string
// value 可以是任意类型的值

如果 $arr 还不存在,将会新建一个,这也是另一种新建数组的方法。不过并不鼓励这样做,因为如果 $arr 已经包含有值(例如来自请求变量的 string)则此值会保留而 [] 实际上代表着字符串访问运算符。初始化变量的最好方式是直接给其赋值。。

要修改某个值,通过其键名给该单元赋一个新值。要删除某键值对,对其调用 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
?>
Copier après la connexion

Note:

如上所述,如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上 1(但是最小为 0)。如果当前还没有整数索引,则键名将为 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);
?>
Copier après la connexion

以上例程会输出:

Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
Array
(
)
Array
(
[5] => 6
)
Array
(
[0] => 6
[1] => 7
)

实用函数

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

Note:

unset() 函数允许删除数组中的某个键。但要注意数组将不会重建索引。如果需要删除后重建索引,可以用 array_values() 函数。

<?php
$a = array(1 => &#39;one&#39;, 2 => &#39;two&#39;, 3 => &#39;three&#39;);
unset($a[2]);
/* will produce an array that would have been defined as
  $a = array(1 => &#39;one&#39;, 3 => &#39;three&#39;);
  and NOT
  $a = array(1 => &#39;one&#39;, 2 =>&#39;three&#39;);
*/
 
$b = array_values($a);
// Now $b is array(0 => &#39;one&#39;, 1 =>&#39;three&#39;)
?>
Copier après la connexion

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

数组做什么和不做什么

为什么 $foo[bar] 错了?

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

<?php
$foo[bar] = &#39;enemy&#39;;
echo $foo[bar];
// etc
?>
Copier après la connexion

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

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

<?php
error_reporting(E_ALL);
ini_set(&#39;display_errors&#39;, true);
ini_set(&#39;html_errors&#39;, false);
// Simple array:
$array = array(1, 2);
$count = count($array);
for ($i = 0; $i < $count; $i++) {
   echo "\nChecking $i: \n";
   echo "Bad: " . $array[&#39;$i&#39;] . "\n";
   echo "Good: " . $array[$i] . "\n";
   echo "Bad: {$array[&#39;$i&#39;]}\n";
   echo "Good: {$array[$i]}\n";
}
?>
Copier après la connexion

以上例程会输出:

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(&#39;fruit&#39; => &#39;apple&#39;, &#39;veggie&#39; => &#39;carrot&#39;);
 
// Correct
print $arr[&#39;fruit&#39;];  // apple
print $arr[&#39;veggie&#39;]; // 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 &#39;fruit&#39; in...
print $arr[fruit];    // apple
 
// This defines a constant to demonstrate what&#39;s going on.  The value &#39;veggie&#39;
// is assigned to a constant named fruit.
define(&#39;fruit&#39;, &#39;veggie&#39;);
 
// Notice the difference now
print $arr[&#39;fruit&#39;];  // apple
print $arr[fruit];    // carrot
 
// The following is okay, as it&#39;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[&#39;fruit&#39;]}";  // Hello apple
 
// This will not work, and will result in a parse error, such as:
// Parse error: parse error, expecting T_STRING&#39; or T_VARIABLE&#39; or T_NUM_STRING&#39;
// This of course applies to using superglobals in strings as well
print "Hello $arr[&#39;fruit&#39;]";
print "Hello $_GET[&#39;foo&#39;]";
 
// Concatenation is another option
print "Hello " . $arr[&#39;fruit&#39;]; // Hello apple
?>
Copier après la connexion

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

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

<?php
echo $arr[somefunc($bar)];
?>
Copier après la connexion

这是一个用函数返回值作为数组索引的例子。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";
?>
Copier après la connexion

注意 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";
?>
Copier après la connexion

因为 E_ERROR 等于 1,等等。

那么为什么这样做不好?

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

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

转换为数组

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

如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 '*' 做前缀。这些前缀的前后都各有一个 NULL 字符。这会导致一些不可预知的行为:

<?php
 
class A {
   private $A; // This will become &#39;\0A\0A&#39;
}
 
class B extends A {
   private $A; // This will become &#39;\0B\0A&#39;
   public $AA; // This will become &#39;AA&#39;
}
 
var_dump((array) new B());
?>
Copier après la connexion

上例会有两个键名为 'AA',不过其中一个实际上是 '\0A\0A'。

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

比较

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

示例

PHP 中的数组类型有非常多的用途。以下是一些示例:

<?php
// This:
$a = array( &#39;color&#39; => &#39;red&#39;,
           &#39;taste&#39; => &#39;sweet&#39;,
           &#39;shape&#39; => &#39;round&#39;,
           &#39;name&#39;  => &#39;apple&#39;,
           4        // key will be 0
         );
 
$b = array(&#39;a&#39;, &#39;b&#39;, &#39;c&#39;);
 
// . . .is completely equivalent with this:
$a = array();
$a[&#39;color&#39;] = &#39;red&#39;;
$a[&#39;taste&#39;] = &#39;sweet&#39;;
$a[&#39;shape&#39;] = &#39;round&#39;;
$a[&#39;name&#39;]  = &#39;apple&#39;;
$a[]        = 4;        // key will be 0
 
$b = array();
$b[] = &#39;a&#39;;
$b[] = &#39;b&#39;;
$b[] = &#39;c&#39;;
 
// After the above code is executed, $a will be the array
// array(&#39;color&#39; => &#39;red&#39;, &#39;taste&#39; => &#39;sweet&#39;, &#39;shape&#39; => &#39;round&#39;,
// &#39;name&#39; => &#39;apple&#39;, 0 => 4), and $b will be the array
// array(0 => &#39;a&#39;, 1 => &#39;b&#39;, 2 => &#39;c&#39;), or simply array(&#39;a&#39;, &#39;b&#39;, &#39;c&#39;).
?>
Copier après la connexion

Example #8 使用 array()

<?php
// Array as (property-)map
$map = array( &#39;version&#39;    => 4,
             &#39;OS&#39;         => &#39;Linux&#39;,
             &#39;lang&#39;       => &#39;english&#39;,
             &#39;short_tags&#39; => 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,
                   &#39;a&#39;  =>  4,
                           11, // key = 6 (maximum of integer-indices was 5)
                   &#39;8&#39;  =>  2, // key = 8 (integer!)
                   &#39;02&#39; => 77, // key = &#39;02&#39;
                   0    => 12  // the value 10 will be overwritten by 12
                 );
// empty array
$empty = array();
?>
Copier après la connexion

Example #9 集合

<?php
$colors = array(&#39;red&#39;, &#39;blue&#39;, &#39;green&#39;, &#39;yellow&#39;);
 
foreach ($colors as $color) {
   echo "Do you like $color?\n";
}
 
?>
Copier après la connexion

以上例程会输出:

Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?

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

Example #10 在循环中改变单元

<?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);
?>
Copier après la connexion

以上例程会输出:

Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => YELLOW
)

本例生成一个下标从 1 开始的数组。

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

<?php
$firstquarter  = array(1 => &#39;January&#39;, &#39;February&#39;, &#39;March&#39;);
print_r($firstquarter);
?>
Copier après la connexion

以上例程会输出:

Array
(
[1] => 'January'
[2] => 'February'
[3] => 'March'
)

Example #12 填充数组

<?php
// fill an array with all items from a directory
$handle = opendir(&#39;.&#39;);
while (false !== ($file = readdir($handle))) {
   $files[] = $file;
}
closedir($handle);
?>
Copier après la connexion

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

Example #13 数组排序

<?php
sort($files);
print_r($files);
?>
Copier après la connexion

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

Example #14 递归和多维数组

<?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";
?>
Copier après la connexion

数组(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
?>
Copier après la connexion


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!