[ノート]『PHP Cookbook 』と『初めてのPHP』を読む（配列　応用編） PHP 

#配列応用編　（更新予定）
##1.配列の初めのインデックスは0を希望しないとき：

```php
//整数の負数、非整数でも可能
$presidents=array(1=>'Washington','Adams','Jefferson','Madison');
var_dump($presidents);
```

##2.多数の要素を一つのキーに保存

```php
$fruits=array('red'=>array('starwberry','apple'),'yellow'=>array('banana'));
```
或いはオブジェクトを使う

出力したいとき：

```php
$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>";
    }
}
```

##3.連続している数を配列として生成したい

```php
$cards=range(1,52);
```

増量は１でないときでも可能

```php
$even=range(2,52,2);
```



##4.ループで配列を処理する

```php
//方法１　値を順に処理したい場合
foreach($array as $value){
	//処理
}

//方法2 キーの使用が必要な場合
foreach($array as $key=>$value){
	//処理
}

//方法３　forループで処理
for($key,$size=count($array);$key<$size;$key++){
	//処理

}

//方法４　list()とwhileでeach()を使用
while(list($key,$value)=each($array)){
	//処理
}

```

説明：
foreachの場合、処理されたのは配列のコピーであり、もともとのものではない。
それに対して、for,each()の場合、処理されたのは配列自体の要素。
ですので、foreachを使用する場合、配列を直接に引用する必要がある


```php

//$costを使用しても無効
foreach($items as $item=>$cost){
	if(!in_stock($item)){
	unset($items[$item]);
	}
}
```
またforループを使うとき、count（）を使って、あらかじめ変数に配列のサイズを保存することは効率的。


補足：
＊特別な処理を行いたいとき：


```php

//$fは処理のfunction
array_map($f,$array);
```


```php
//全ての単語を小文字に：
$words=array('Emc','GOforit','Japan');
$lc=array_map('strtolower',$words);
var_dump($lc);
```

＊配列なのかわからないとき実施すべき保護措置：


```php
if(is_array($items)){
	//配列ですので、処理する
}else{
	//配列でないので、別の処理
}
```


##5.配列から要素を削除したい

＊要素を多数削除したい、または削除したいものは連続的でないとき、unset()を使用


```php
unset($e)
unset($e1,$e2)
```

unsetを使用した効果を調べた結果、

```php
$array=array('aaa','bbb','ccc','ddd');
unset($array[0]);
var_dump($array);
```

出力は

```php
array(3) { [1]=> string(3) "bbb" [2]=> string(3) "ccc" [3]=> string(3) "ddd" }
```
なので、インデックスは変化しないので、配列はインデックスは詰まらなく、削除後配列にはスペースが残っていてる。

unsetを使用するほか、空の値を渡す方法もある。unsetと違って、この要素はまだ存在する。
新しい値を入れる予定があれば、空の値、または０を要素に渡す方法を採用すればいい。

```php
$array[3]=$array['foo']='';
```


＊スペースを残してたくないとき、要素を連続的に削除したいときは：

```php
array_splice($array,$offset,$length,[$replacement]);
```
または

```php
array_values($array)
```
を使用。array_valuesはスペースを残らずに配列を詰めることができるが、数字はインデックスになるので要注意。

＊配列の末尾に要素を削除：

```php
array_pop()
```

＊配列の頭の要素を削除：

```php
array_shift()
```

##6.配列を拡大、または縮小
＊  array_pad()で配列を拡大。

```php
array_pad($array,$pad_size,$pad_value)
```

```php
$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()で配列を縮小

```php
//注意点：array_splice()返却したのは削除された配列。$arrayに代入しないこと。
array_splice($array,$offset)
```

##7.一つの配列に別の配列を追加

＊　方法１　array_merge()を使用

```php
//注意点　mergeされた配列に重複のキーが存在する場合、元の要素の値がmergeする新しい要素の値になる
$p_languages=array('Perl','PHP');
$p_languages=array_merge($p_languages,array('Python'));
print_r($p_languages);
```
＊　方法2 ＋を使用

```php
//注意点　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()を使用

```php
join($glue,$array);
```


```php
$array=array('mama','papa','me');
$string=join(',',$array);
print_r($string);
```

```php
//例：要素をbタグの中に入れる
$html=array('gogogo','oleoleole','nono');
$left='<b>';
$right='</b>';

$html=$left.join("$right,$left",$html).$right;
print $html;
```

##9.特定のkeyが配列の中に存在するか？
＊　array_key_exists()を使用

```php
array_key_exists('key',$array)　
```

＊　値がnullでないキーを調べたい場合：

```php
if(isset($array['key'])){
   //配列arrayの中に、キー’key’に対応する値がnullではないとき、以下の処理を行う
}
```

##10.指定された要素の値が配列に存在するかを調べたい

＊　in_array()を使用（探したい値が少ない場合）

```php
//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";
}
```


```php
//探したい値が多数：
$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()を使用

```php
//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";
}
```


```php
//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()を使用する場合、途中で停止できないので、foreachを使う方が便利


```php
//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;}
    }
}
```
##13.配列の最大値と最小値を探す

```php
$largest=max($array);
$smallest=min($array);
```
##14.配列を逆転

```php
$array=array("cat"=>"imy","dog"=>"toto","fish"=>"asuka");
$reversed=array_reverse($array);
print_r($array);
print_r($reversed);
```

```php
```

##15 ソート

sortを使うと、配列は辞書順になる

```php
$states=array('Delaware', 'Pennsylvania', 'New Jersey');
sort($states);
print_r($states);
```

数値順に並べたい場合：

```php
$scores = array(1, 10, 2, 20);
sort($scores, SORT_NUMERIC);
print_r($scores);
```

キーと値の関連を保ちたい場合：asort()を使用

```php
$states = array(1 => 'Delaware', 'Pennsylvania', 'New Jersey');
asort($states);
print_r($states);
```

数字の順序を並べる:文字列と数字が混ざった場合

```php
$tests=array('test1.php', 'test10.php', 'test11.php', 'test2.php');
natsort($tests);
print_r($tests);
```

##16 ソートを自分でデザインしたい
usortを使用

```php
$tests = array('test1.php', 'test10.php', 'test11.php', 'test2.php');
// sort in reverse natural order
usort($tests, function ($a, $b) { return strnatcmp($b, $a);
});
```

ソートの速度をアップしたい：

```php
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ランダンムにソート

```php
shuffle($array)
```

##18 重複の要素を削除:array_unique

```php
$array=array('df','dd','sd','df','df','sd','dd','ss','gg');
$unique=array_unique($array);
print_r($unique);
```

方法2

```php
$array2=array('df','dd','sd','df','df','sd','dd','ss','gg');
foreach ($array2 as $element){
    $newArray[$element]=$element;
}
print_r($newArray);
```

##19 配列の中の各要素に関数を応用したい

```php
$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 和集合 積集合　などを計算

```php
$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);
```