ホームページ  >  記事  >  バックエンド開発  >  PHP 配列の実践的な基本

PHP 配列の実践的な基本

炎欲天舞
炎欲天舞オリジナル
2017-08-04 16:49:521327ブラウズ


1. PHP 配列の基本部分

PHP配列の分類


異なる添字に従って、PHP配列は連想配列とインデックス配列に分けられます
インデックス配列: 添字は0から始まり、順番に増えていく
連想配列: 添字は文字列形式であり、各添字文字列は配列の値と 1 対 1 で関連付けられます (オブジェクトのキーと値のペアに似ています)

コードのデモ:


$arr1 = array(1,2,3,4,5,6,7);//索引数组
var_dump($arr1);
   
$arr2 = array("one"=>1,"two"=>2,"three"=>3);//关联数组
var_dump($arr2);
   
$arr3 = array(1,"one"=>2,3,5=>4,5,6,"10.0"=>7,"08"=>8,"08"=>10,"hahah"=>9);
var_dump($arr3);

II連想配列とインデックス配列について


1. 配列では、インデックス配列と連想配列が同時に存在できます。
array(1,2,3,"one"=>4);

2. 配列内のすべてのインデックス配列は、指定されていない場合、関連付けられた項目を削除し、デフォルトで拡大します (つまり、連想配列はインデックス ビットを占有しません);
array(1,2,"one"=>3,4,5);//1,2,4,5 のインデックス --->0 /1 /2/3

3. 連想配列のキーが純粋な 10 進整数文字列の場合、
はこの数値をインデックス配列のインデックス値 ("10.0"/") に変換します。 08" 形式では、インデックスに変換されず、結合配列のままです)
array(1,2,"one"=>3,"9"=>4,"010"=>5) ;//1 ,2,4 Index --->0/1/9

4. 関連する配列のキーを手動で指定する場合、インデックス配列の添字 (それが繰り返される場合)前のキーまたは添字の場合、後で指定した値が前の値を上書きします
array(1,"one"=>2,0=>5,"one"=>6);--- >Print array, 0=>5, "one"=>6

5。インデックス配列の添字が手動で指定されている場合、後続の自己増加添字は、前の添字。
array(1,2,7=>3,4);--->1,2,3,4 の添字--->0/1/7/8

数组的声明方式


1、直接赋值声明
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
var_dump($arr);

2、[]字面量声明(PHP5.4版本之后能用)
$arr = [1,2,3,4,"one"=>5,6];
var_dump($arr);

3、Array()声明  没有new关键字
$arr = array(1,2,3,4,5);
var_dump($arr);

 

数组元素的读取


PHP中,数组支持[]和{}读取下标。

多维数组

①数组的一个值,依然是一个数组,我们称这种数组为多维数组;
②多维数组,不要求所有的项都是数组,可以是数组与普通值的混合;
③多维数组,也不要求每个子数组的个数限制,可以是任意的长度。

使用多维数组,一定要注意,数组中分隔用逗号!
原则上,多维数组一般不超过3层使用!

 

三维数组代码演示如下:


$H51701 = array(
"group1"=>array(
array("name"=>"张三","age"=>14,"sex"=>"男"),
array("name"=>"李四","age"=>15,"sex"=>"男"),
array("name"=>"王二","age"=>13,"sex"=>"男")
),
"group2"=>array(
array("name"=>"张三","age"=>15,"sex"=>"男"),
array("name"=>"李四","age"=>15,"sex"=>"男"),
array("name"=>"王二","age"=>14,"sex"=>"男")
),
"group3"=>array(
array("name"=>"张三","age"=>14,"sex"=>"男"),
array("name"=>"李四","age"=>18,"sex"=>"男"),
array("name"=>"王二","age"=>24,"sex"=>"男")
),
);
var_dump($H51701);

 

 

二、数组遍历

 

1、使用for循环遍历数组
count($arr);用于统计数组元素的个数

for循环只能用于遍历,纯索引数组!
如果存在关联数组,count统计时会统计两种数组的总个数,使用for循环遍历混合数组,导致数组越界!

代码如下:


 $arr = array(1,2,3,"one"=>4,5,6,7);
 $num = count($arr);
 echo"数组元素的个数{$num}<br/>";
 for($i=0;$i<$num;$i++){
 echo "{$i}==>{$arr[$i]}<br/>";
 }

 

2、forEach循环遍历数组
foreach可以遍历任何类型的数组!

代码如下:


 $arr = array(1,2,3,"one"=>4,5,6,7);
 foreach($arr as $key=>$item){
 echo "{$key}==>{$item}<br/>";
 }

 

下面我们来做一个数组遍历的小练习~看代码~


 $arr = array(
"group1"=>array(
array("name"=>"张三","age"=>14,"sex"=>"男"),
array("name"=>"李四","age"=>12,"sex"=>"男"),
array("name"=>"王二","age"=>18,"sex"=>"男")
),
"group2"=>array(
array("name"=>"张三","age"=>14,"sex"=>"男"),
array("name"=>"李四","age"=>16,"sex"=>"男"),
array("name"=>"王二","age"=>19,"sex"=>"男")
),
"group3"=>array(
array("name"=>"张三","age"=>14,"sex"=>"男"),
array("name"=>"李四","age"=>12,"sex"=>"男"),
array("name"=>"王二","age"=>13,"sex"=>"男")
),
);

foreach($arr as $key=>$value){
echo "{$key}<br/>"; 
foreach($value as $key1=>$value1){
echo "第".($key1+1)."个同学<br/>";
foreach($value1 as $key2=>$value2){
echo "{$key2}==>{$value2}<br/>";
}
echo"<br/>";
}
echo"----------------------<br/>";
}

3、使用list(),each(),while()遍历数组
list():用于将数组的每一个值,赋值给list函数的每一个参数。(list函数的参数,必须3aa5e7023900ea7440da035901095b48$a=1; $b=2; $c=3;

注意
①list()在解析数组时,只解析索引数组;
②list可以通过空参数,选择性的解析数组的值;
list($a,,$b)=[1,2,3];-->$a=1;$b=3;

each():用于返回数组当前指针所在位的键值对!并将指针后移一位;
返回值:如果指针有下一位,返回一个数组。包含一个索引数组(0-键,1-值)和一个关联数组("key"-键,"value"-值);
如果指针没有下一位,返回false。

4、使用list()/each()/while()配合遍历数组※※※


 while(list($key,$value) = each($arr)){
 echo "{$key}-->{$value}<br>";
 }
 reset($arr);

!!!数组使用each()遍历完一遍后,指针使用处于最后一位的下一位,即再用each(),始终返回false;
如果还需使用,需用reset($arr);函数,重置数组指针。

$arr = [1,2,3,4];
list($a,$b,$c,$d) = $arr;
echo "a-->{$a}076402276aae5dbec7f672f8f4e5cc81";
echo "b-->{$b}076402276aae5dbec7f672f8f4e5cc81";
echo "c-->{$c}076402276aae5dbec7f672f8f4e5cc81";
echo "d-->{$d}076402276aae5dbec7f672f8f4e5cc81";

while($a = each($arr))

①each($arr)返回数组或false;
②把数组或false赋值给$a;
③while判断$a如果是数组,继续执行下一位;
如果$a是false,终止循环。


while($a = each($arr)){
echo "{$a[0]}-->{$a[1]}<br>";
echo "{$a[&#39;key&#39;]}-->{$a[&#39;value&#39;]}<br>";
}

while(true){
$a = each($arr);
if($a){
echo "{$a[0]}-->{$a[1]}<br>";
echo "{$a[&#39;key&#39;]}-->{$a[&#39;value&#39;]}<br>";
}else{
break;
}
}

while(list($key,$value) = each($arr)){
echo "{$key}-->{$value}<br>";
} 
reset($arr);

 

5、使用数组指针遍历数组

①next:将数组指针,后移一位,并返回后一位的值,没有返回false
②prev:将数组指针,前移一位,并返回前一位的值,没有返回false
③end:将数组指针,移至最后一位,返回最后一位的值,空数组返回false
④reset:将数组指针,恢复到第一位,并返回第一位的值,空数组返回false
⑤key:返回当前指针所在位的键;
⑥current:返回当前指针所在位的键;


$arr = [1,2,3,4,"one"=>5];
while(true){
echo key($arr);
echo "--";
echo current($arr);
echo "<br>";
if(!next($arr)){
break;
}
}
reset($arr);
do{
echo key($arr);
echo "--";
echo current($arr);
echo "<br>";
}while(next($arr));
reset($arr);

 

三、超全局数组


超全局数组,超全局变量,预定义数组,预定义变量——说的都是它。

PHP给我们提供了一组包含强大功能的超全局数组,可以在任何地方,任何作用域不需声明,直接使用!不受任何作用域限制。


PHP超全局数组

       1、服务器变量: $_SERVER
  2、环境变量:$_ENV
  3、HTTP GET变量:$_GET
  4、HHTP POST变量:$_POST
  5、request变量:$_REQUEST
  6、HTTP文件上传变量:$_FILES
  7、HTTP Cookies:$_COOKIE
  8、Session变量:$_SESSION
  9、Global变量:$GLOBALS

 

1、服务器变量: $_SERVER
var_dump($_SERVER);
echo ($_SERVER{'HTTP_USER_AGENT'});

2、环境变量:$_ENV
将系统环境变量,转变为PHP中的数组,就是$_ENV;

PHP默认是关闭此全局数组的。如果需要使用,
需修改php.ini文件中的variables_order = "GPSC",
改为variables_order = "EGPSC";

但是,修改后会有系统性能损失,港方并不推荐使用。
可以使用getenv()函数取代全局变量,取出每个系统环境变量的值。

phpinof();函数,包含了有关PHP的各种信息,其实environment板块就是系统环境的变量,可以使用getevn()函数取出其中的值;

3、HTTP GET变量:$_GET
获取前台通过get方式提交的数据


if(isset($_GET["sybmit"]&&isset($_GET["pwd"]))){
if($_GET["username"]=="111"&&$_GET["pwd"]=="111"){
echo "Get登录成功!";
}else{
echo "Get登录失败!";
}
}

 

4、HHTP POST变量:$_POST
获取前台通过post方式提交的数据


if(isset($_POST["sybmit"])){
if($_POST["username"]=="111"&&$_POST["pwd"]=="111"){
echo "POST登录成功!";
}else{
echo "POST登录失败!";
}
}

 

5、request变量:$_REQUEST
包含了$_GET,$_POST和$_COOKIE的数组
由于request同时包含get和post,可能导致get与post的键冲突,并且频率也不高。所以,并不使用request。
var_dump($_REQUEST);

6、HTTP文件上传变量:$_FILES
通过HTTP POST方式上传到当前脚本的项目的数组。
var_dump($_FILES);

7、HTTP Cookies:$_COOKIE
取到页面中的Cookie信息
1 setcookie("cookie","haha");

2 $_COOKIE["hehe"] = "hehe";

3 var_dump($_COOKIE); 


8. セッション変数: $_SESSION
セッションに保存されている情報を取得します。
session_start();
$_SESSION["haha"] = "haha";
var_dump($_SESSION);*/

9. グローバル変数: $GLOBALS
$GLOBALS上記の 8 つのグローバル配列を使用すると、$GLOBALS["_SERVER"] を通じて $_SERVER
を取得でき、$GLOBALS 配列に添字を追加することもできます。関数内外で自由にアクセスできるグローバル変数を作成します: $GLOBALS["name"] = "zhangsan";
var_dump($GLOBALS["_SERVER"]);

4. 配列関数

 

1、返回数组所有的值,返回数组
var_dump(array_values($arr));

2、返回数组所有的键,返回数组
var_dump(array_keys($arr));

3、检测数组中是否包含某个值。返回真、假
参数:需要查询的值,数组,true(===)/false(===) 默认
var_dump(in_array("8",$arr,true));

4、交换数组中的键和值,返回新数组
var_dump(array_flip("8",$arr));

5、反转数组,返回新数组
参数:需要反转的数组
true:保留原有索引数组的下标与值的匹配。
false:只反转值,键不反转,默认
无论true/false,都不会影响关联数组,关联数组键,值永远是一对。
var_dump(array_reverse($arr,true));

6、统计数组元素个数
count($arr);

7、统计数组中,所有值出现的次数,返回一个新数组
新数组格式:键-->原数组的值(去重后的值)
        值-->原数组对应的值出现的次数。
var_dump(array_count_values($arr));

8、移出数组中重复的值!
var_dump(array_unique($arr));

9、过滤数组中的每一个值:
①不传回调函数:过滤掉所有空值(0/""/null/false/"0"/[])
②传回调函数:需要给回调函数传递一个参数,判断参数是否符合要求,如果符合,return true;否则,return false。


var_dump(array_filter($arr,function($num){
if($num>4){
return true;
}else{
return false;
}
}));


通过回调函数,对数组的每一个值,进行处理操作。(直接修改原数组,并返回bool类型的是否成功)
执行时,会给回调函数传递两个参数,分别是数组的value,key,然后可以在毁掉函数中,对值和键进行处理。
但是,牵扯到修改值的时候,必须要传递地址&!!!!
$fruits = array("d" => "lemon","a" => "orange","b" => "banana","c" => "apple");


 var_dump(array_walk($fruits,function(&$item,$key){
 echo "{$key}-->{$item}<br>";
 $item .= $key;
 }));
 var_dump($fruits);

 

将数组的每个值交由回调函数进行映射处理
array_map():第一个参数,是一个回调函数。第二个参数起,是>=1个数组。
有几个数组,可以给回调函数传几个参数,,表示每个数组的一个value;
可以对value进行处理,处理完以后通过return返回,那么新数组的对应的值就是你return回去的值。

【array_map与array_walk的异同】
相同点都能遍历数组,通过回调函数,重新处理数组的每一个值;
不同点
①walk只能传一个数组,回调函数接收这个数组的值和键;
map可以传多个数组,回调函数接收每个数组的值;
②walk直接修改原数组,而map不修改原数组,将新数组返回;
③walk给回调函数传递一个其余参数,map只能传数组的值;
④处理方式上,walk如果需要改掉原数组的值,需在回调函数中传递地址,直接修改变量的值;
而map,是通过将新的值,用return返回,即可修改新数组的值。
$a = [1,2,3,4,5];
$b = [1,2,3,4,5];


 var_dump(array_walk($fruits,function(&$item,$key){
 echo "{$key}-->{$item}<br>";
 $item .= $key;
 }));
 var_dump($fruits);

 

五、数组函数

sort -- 配列をソート(昇順)

var_dump(sort($arr));


rsort -- 配列を逆順(降順)にソート


u sort -- ユーザー定義の比較関数を使用して配列内の値を並べ替えます


asort -- 配列を並べ替え、インデックス関係を維持します (連想配列並べ替え)


arsort-- 配列を逆ソートし、インデックス関係を維持します


uasort--配列をソートし、インデックス関係を維持するためのユーザー定義の比較関数


ksort--ソートキー名で配列を並べ替えます


krsort--キー名で配列を逆ソート


uksort--ユーザー定義の比較関数を使用して配列内のキー名を並べ替えます


natsort- - 「自然ソート」アルゴリズムを使用して配列をソートします


natcasesort -- 「自然ソート」アルゴリズムを使用して大文字と小文字を区別せずに配列をソートします


array_multisort -- ソート複数の配列または多次元 配列を並べ替えます
最初のパラメータ: 最初の配列、必須
2 番目のパラメータ: SORT_DESC;SORT_ASC (昇順 降順);
3 番目のパラメータ: SORT_STRING/SORT_NUMERIC (文字列または数値ソート)
の後に複数の配列が続く
ソート規則: 最初の配列を最初にソートし、その後の配列は最初の配列との対応関係に従って列ごとにソートされます

さらにある場合。配列および複数の配列はソートされなければなりません。そうでない場合は、警告が報告されます。

最初のパラメータ: 配列、必須。パラメーター: インターセプトする位置から開始し、負の数は右から左に数えることを意味します (配列 ps: 添字ではなく連想配列を含む) の順序に従って
3 番目のパラメーター: インターセプトされた長さ (オプション)、インターセプトされる長さデフォルトで終了
4番目のパラメータ: bool型パラメータ、デフォルトはfalse、インデックスは並べ替えられ、trueはインデックスの関連付けを維持します
$arr1 = array_slice($arr, 2,5,TRUE);
array_splice($ offset)
戻り値: 配列(削除された部分)


パラメータ:
1. 配列のアドレスは元の配列を変更します
2. 番号
から削除を開始します。 3. 削除の長さは、入力されない場合、デフォルトは最後までです
4. 入力されない場合、デフォルトは、削除、埋め込み、削除された部分を埋められた部分で置き換えることです。
$ arr1 = array_splice($arr, 2,5,[1 ,2,3,4]);

array_combine($keys, $values); 1 つの配列の値をキー名と他の配列の値を値として指定します。

array_combine ($keys' キーの配列として'、$values' 値の配列として');
2 つの配列の長さは次のようにする必要があります。同じです。そうでない場合は、警告が報告されます


array_merge($array1);1つ以上の配列を結合します
複数の配列を結合し、前の配列の後に後の配列を結合します
複数の配列に同じ名前を持つ複数の関連付けられたキーがある場合、後者は前の配列を上書きします


array_intersect($array1, $array2);2つの配列が交差しています
複数の配列が交差しており、結果は最初の配列のキーと値の関連付けの一致を保持します


array_diff($array1, $array2);複数の配列の差分セットを取得する;
複数の配列から最初の配列に含まれるが他の配列に含まれない値を取得し、保持します最初の配列のキーと値の関連付け


配列の最後の値を削除します

array_push($var);配列の最後に 1 つ以上の値を挿入します。

array_shift();
削除された値を返します。 var);
配列の先頭に1つ以上の値を挿入; 処理後の要素の数を返す



array_rand($input);配列内の1つから複数のキー名をランダムに抽出する! 2 番目のパラメータは空であり、1 つ描画することを意味し、数値 n を渡すと n を描画することを意味します


shuffle();
関数をシャッフルして並べ替えます


それでは~~~今日の内容ですまずはここで共有してください。私は小さな女の子で初心者でもあります。気に入ったら、「いいね」をしてください。よろしくお願いします。


以上がPHP 配列の実践的な基本の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。