LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-23

配列応用編 (更新予定)

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);
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0