[筆記本]閱讀「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);
广告
将在 10 秒后关闭
bannerAds