配列応用編 (更新予定)
1.配列の初めのインデックスは0を希望しないとき:
//整数の負数、非整数でも可能
$presidents=array(1=>'Washington','Adams','Jefferson','Madison');
var_dump($presidents);
2.多数の要素を一つのキーに保存
$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>";
}
}
3.連続している数を配列として生成したい
$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()
6.配列を拡大、または縮小
* 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.特定のkeyが配列の中に存在するか?
* array_key_exists()を使用
array_key_exists('key',$array)
* 値がnullでないキーを調べたい場合:
if(isset($array['key'])){
//配列arrayの中に、キー’key’に対応する値がnullではないとき、以下の処理を行う
}
10.指定された要素の値が配列に存在するかを調べたい
* 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()を使用する場合、途中で停止できないので、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;}
}
}
13.配列の最大値と最小値を探す
$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);
16 ソートを自分でデザインしたい
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);
方法2
$array2=array('df','dd','sd','df','df','sd','dd','ss','gg');
foreach ($array2 as $element){
$newArray[$element]=$element;
}
print_r($newArray);
19 配列の中の各要素に関数を応用したい
$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);