[筆記本]閱讀「PHP Cookbook」和「初學PHP」(陣列進階編)PHP
配列应用编(即将更新)
当不希望数组的初始索引为0时:
//整数の負数、非整数でも可能
$presidents=array(1=>'Washington','Adams','Jefferson','Madison');
var_dump($presidents);
把多个元素保存在一个键中。
$fruits=array('red'=>array('starwberry','apple'),'yellow'=>array('banana'));
或者使用物件
当想要发挥力量时:
$fruits=array('red'=>array('starwberry','apple'),'yellow'=>array('banana'));
foreach ($fruits as $color=>$color_fruit) {
foreach ($color_fruit as $fruit){
print "$fruit is colored $color.<br>";
}
}
我想生成一个连续的数的数组。
$cards=range(1,52);
即使增加量不为1,也可以进行增加。
$even=range(2,52,2);
4. 使用循环处理数组
//方法1 値を順に処理したい場合
foreach($array as $value){
//処理
}
//方法2 キーの使用が必要な場合
foreach($array as $key=>$value){
//処理
}
//方法3 forループで処理
for($key,$size=count($array);$key<$size;$key++){
//処理
}
//方法4 list()とwhileでeach()を使用
while(list($key,$value)=each($array)){
//処理
}
说明:
对于foreach情况而言,处理的是数组的副本,而不是原来的数组本身。
相反地,对于for和each()情况而言,处理的是数组本身的元素。
因此,如果使用foreach的话,需要直接引用数组本身。
//$costを使用しても無効
foreach($items as $item=>$cost){
if(!in_stock($item)){
unset($items[$item]);
}
}
在使用for循环时,使用count()函数将数组的大小保存到变量中是高效的。
*需进行特别处理时:
//$fは処理のfunction
array_map($f,$array);
//全ての単語を小文字に:
$words=array('Emc','GOforit','Japan');
$lc=array_map('strtolower',$words);
var_dump($lc);
不确定是否为数组时应采取的保护措施:
if(is_array($items)){
//配列ですので、処理する
}else{
//配列でないので、別の処理
}
5. 我想要从数组中删除元素。
当想要删除多个要素,或者要删除的内容不是连续的时候,可以使用unset()函数。
unset($e)
unset($e1,$e2)
通过使用unset功能进行调查的结果是,
$array=array('aaa','bbb','ccc','ddd');
unset($array[0]);
var_dump($array);
努力是力量的来源。
array(3) { [1]=> string(3) "bbb" [2]=> string(3) "ccc" [3]=> string(3) "ddd" }
因此,索引不会改变,因此数组的索引不会被压缩,删除后数组中会保留空间。
除了使用 unset 外,还有一种方法是传递空值。与 unset 不同的是,该元素仍然存在。
如果打算放入新值,可以选择传递空值或 0 给元素。
$array[3]=$array['foo']='';
当你不想保留空白时,想要连续删除元素的时候,可以:
array_splice($array,$offset,$length,[$replacement]);
又或者
array_values($array)
可以使用array_values函数来紧凑地填充数组,但需要注意数字将成为索引的情况。
*删除数组末尾的元素:
array_pop()
删除数组的第一个元素。
array_shift()
扩大或缩小数组尺寸。
* 使用array_pad()函数扩大数组。
array_pad($array,$pad_size,$pad_value)
$array=array('apple','banana','cocount');
$array=array_pad($array,5,'');
var_dump($array);
//pad_size は負数の場合、配列の頭から配列の長さがpad_sizeになるまでpad_valueを加入
$array=array_pad($array,-7,'zucchini');
var_dump($array);
* 使用array_splice()函数来缩小数组的大小。
//注意点:array_splice()返却したのは削除された配列。$arrayに代入しないこと。
array_splice($array,$offset)
7. 将一个数组添加到另一个数组中。
1. 使用 array_merge() 方法
//注意点 mergeされた配列に重複のキーが存在する場合、元の要素の値がmergeする新しい要素の値になる
$p_languages=array('Perl','PHP');
$p_languages=array_merge($p_languages,array('Python'));
print_r($p_languages);
使用方法2
//注意点 mergeと違って、重複のキーが存在する場合、+の左の値を採用する。
$uc=array('a','b'=>'B');
$lc=array('a','b'=>'b');
print "<br>";
print_r($uc+$lc);
print_r($lc+$uc);
print "<br>";
print_r($uc);
print_r($lc);
8. 将数组转换为格式化字符串
使用join()方法
join($glue,$array);
$array=array('mama','papa','me');
$string=join(',',$array);
print_r($string);
//例:要素をbタグの中に入れる
$html=array('gogogo','oleoleole','nono');
$left='<b>';
$right='</b>';
$html=$left.join("$right,$left",$html).$right;
print $html;
9. 这个数组内是否存在特定的关键字?
使用array_key_exists()进行判断
array_key_exists('key',$array)
如果想要检查值不为null的键:
if(isset($array['key'])){
//配列arrayの中に、キー’key’に対応する値がnullではないとき、以下の処理を行う
}
想要检查指定元素的值是否存在于数组中。
如果要查找的值较少,则使用in_array()函数。
//in_array()厳密に比較するときにtrueをオプションとして代入
$book_collection=array('Emma','Price and Prejudice','Northhanger Abbey');
$book='Sense and Sensibility';
if(in_array($book,$book_collection,true)){
echo "Own it";
}else{
echo "Need it";
}
//探したい値が多数:
$book_collection=array('Emma','Price and Prejudice','Northhanger Abbey');
$book=array('Sense and Sensibility','Emma');
//本の名前はキー、値は整数になる
$book_collection=array_flip($book_collection);
//print_r($book_collection);
foreach ($book as $item){
if(isset($book_collection[$item])){
echo "Own $item";
}else{
echo "Need $item";
}
print "<br>";
}
11. 我想要查找给定元素的位置。
使用array_search()函数
//array_search() 探したい値が見つかる場合:キーが返却される 見つからなかった場合、falseが返却される
$array=array('Emma','Price and Prejudice','Northhanger Abbey');
$value='Emma';
$position=array_search($value,$array);
//ご注意、結果0の場合は、$position!==falseでチェック
if($position!==false){
print "getted in $position";
}
//array_searchを使用
print "<br>";
$favorite_foods = array(1 => 'artichokes', 'bread', 'cauliflower', 'deviled eggs');
$food = 'cauliflower';
$position = array_search($food, $favorite_foods);
var_dump($position);
print "<br>";
if ($position !== false) {
echo "My #$position favorite food is $food";
}else{
echo "Blech! I hate $food!";
}
print "<br>";
//キーが数字でなくてもok
$favorite_foods = array('a' => 'artichokes', 'b'=>'bread', 'b2'=>'bread','c'=>'cauliflower', 'd'=>'deviled eggs');
$food = 'cauliflower';
$position = array_search($food, $favorite_foods);
var_dump($position);
print "<br>";
12. 分析满足需求和要求的要素
如果使用array_filter(),则无法在中途停止,因此使用foreach更方便。
//array_filter()
$movies=array(/*...*/);
$flops=array_filter($movies,function($movie){
return ($movie['box_office_fross']<5000000)?1:0;
});
print "<br>";
function blockbuster($movies){
foreach ($movies as $movie){
if($movie['box_office_gross']>200000000){return $movie;}
}
}
//foreach()
function blockbuster($movies){
foreach ($movies as $movie){
if($movie['box_office_gross']>200000000){return $movie;}
}
}
寻找数组的最大值和最小值
$largest=max($array);
$smallest=min($array);
14. 倒置数组
$array=array("cat"=>"imy","dog"=>"toto","fish"=>"asuka");
$reversed=array_reverse($array);
print_r($array);
print_r($reversed);
15 排序
使用sort函数,数组将按照字母顺序排列。
$states=array('Delaware', 'Pennsylvania', 'New Jersey');
sort($states);
print_r($states);
如果想按照数值顺序排列:
$scores = array(1, 10, 2, 20);
sort($scores, SORT_NUMERIC);
print_r($scores);
如果想要保持键和值之间的关系:可以使用asort()函数。
$states = array(1 => 'Delaware', 'Pennsylvania', 'New Jersey');
asort($states);
print_r($states);
整理数字的顺序:当字符串和数字混合在一起时。
$tests=array('test1.php', 'test10.php', 'test11.php', 'test2.php');
natsort($tests);
print_r($tests);
我想自己设计排序方式。
使用 usort
$tests = array('test1.php', 'test10.php', 'test11.php', 'test2.php');
// sort in reverse natural order
usort($tests, function ($a, $b) { return strnatcmp($b, $a);
});
我想加快排序的速度。
function array_sort($array,$map_func,$sort_func=''){
$mapped=array_map($map_func,$array);
var_dump($mapped);
print "<br>";
if(''===$sort_func){
//keyは変わらない。
asort($mapped);
var_dump($mapped);
}else{
uasort($mapped,$sort_func);
}
while(list($key)=each($mapped)){
//
$sorted[]=$array[$key];
var_dump($sorted);
print "<br>";
}
return $sorted;
}
function map_length($a){
return strlen($a);
}
$test=array('one', 'two', 'three', 'four', 'five',
'six', 'seven', 'eight', 'nine', 'ten');
$tests=array_sort($test,'map_length');
print_r($tests);
随机排序17个项目
shuffle($array)
18 删除重复元素:array_unique
$array=array('df','dd','sd','df','df','sd','dd','ss','gg');
$unique=array_unique($array);
print_r($unique);
第二种方法
$array2=array('df','dd','sd','df','df','sd','dd','ss','gg');
foreach ($array2 as $element){
$newArray[$element]=$element;
}
print_r($newArray);
我想对数组中的每个元素应用函数。
$names=array('firstname'=>'Baba','lastname'=>"O'Riley");
array_walk($names,function(&$value,$key){
$value=htmlentities($value,ENT_QUOTES);
});
foreach ($names as $name){
print "$name<br>";
}
计算20与集合的交集合。
$a=array(2,4,5,3,3,10);
$b=array(3,6,3,22,10,7);
//和集合
$union=array_unique(array_merge($a,$b));
var_dump($union);
print "<br>";
//積集合
$intersection=array_intersect($a,$b);
var_dump($intersection);
print "<br>";
//差集合
//こちらは$aの要素、しかも$bに存在しない要素
$difference1=array_diff($a,$b);
var_dump($difference1);
print "<br>";
//こちらは$bの要素、しかも$aに存在しない要素
$difference2=array_diff($b,$a);
var_dump($difference2);
print "<br>";
$difference=array_merge($difference1,$difference2);
var_dump($difference);