【情報整理⑤】PHPの頻出関数を整理して、画面遷移過多による眼病を予防 ~ 配列編 ~


  • Netflixによって世界中から人気を博している「こんまり」さんに、多大な影響を受けて情報整理をしていく記事第五弾。


  • 前回からの健康活動が、「実は整理するために大量に検索しているぶん、画面遷移量は変わらないので、角膜損傷が悪化している」という誰でも分かる事実と、見事に距離を置きながら生活をする現状。

  • 今回は、PHPの頻出関数の「配列」を整理していくことにしよう。


PHP頻出関数


配列


array_key_exists()


  • 指定したキー、または添字が配列にあるか、調べる。



  • issetの違い


    • キーがNULLでも、「true」が出る。



  • 公式マニュアル


// array_key_exists( 'キー', $配列名 )

$search_array = array('number' => 1, 'name' => '佐藤');
if (array_key_exists('neme', $search_array)) {
echo 'ある';
}else{
echo 'ない';
}

// 実行結果

// ない


array_slice()

// array_slice(取得元配列,開始位置,要素数)

$name = array('佐藤','田中','鈴木','上野','高橋','斉藤','中野');
$result = array_slice($name,2,3);
foreach($result as $key => $value){
echo "$key : $value\n";
}

// 実行結果

/*
0 : 鈴木
1 : 上野
2 : 高橋
*/


array_merge(), array_merge_recursive()


  • 配列同士を一つの配列に結合する。


  • array_merge_recursive() は同じ文字列のキーを持つ要素がある場合、上書きされないため、多次元配列としても利用。


  • 公式マニュアル


  • 公式マニュアル


// array_merge(配列1,配列2,配列3)

<?php
$data = array('name' => '佐藤', '田中', '大橋');
$info = array("田中", "大橋", "name" => "鈴木", "age" => 56, '高橋');
$result = array_merge($data, $info);
print_r($result);
?>

// 実行結果

/*
Array
(
[name] => 鈴木
[0] => 田中
[1] => 大橋
[2] => 田中
[3] => 大橋
[age] => 56
[4] => 高橋
)
*/

// array_merge_recursive(配列1,配列2,配列3)

<?php
$data = array("name" => array("nickname" => "さとっち"), '鈴木');
$info = array('上野', "name" => array("nickname" => "たなくん", "高橋"));
$result = array_merge_recursive($data, $info);
print_r($result);

// 実行結果

/*
Array
(
[name] => Array
(
[nickname] => Array
(
[0] => さとっち
[1] => たなくん
)

[0] => 高橋
)

[0] => 鈴木
[1] => 上野
)
*/


in_array()


  • 配列の中に指定された値が含まれているかを返す。


  • 第三引数指定は任意だが、デフォルトがfalseのため、trueを指定しとかないと、予期せぬ結果を起こす可能性がある。


  • 公式マニュアル


// in_array('キー', $配列, true)

$numbers = [0, 1, 2, 3, 4, 5];
var_dump(in_array(3,$numbers, true));
var_dump(in_array('佐藤', $numbers, true));

// 実行結果

/*
bool(true)
bool(false)
*/


shuffle()

// shuffle(配列)

$numbers = [1,3,5,7,9];
shuffle($numbers);
foreach ($numbers as $number) {
echo "$number\n";
}

// 実行結果

/*
7
3
9
5
1
*/


sort(), rsort()

// sort(配列,動作オプション)

$numbers = array(4,3,2,8,34,6463,353,653);
sort($numbers);
foreach($numbers as $key => $value){
echo "$key : $value\n";
}

// 実行結果

/*
0 : 2
1 : 3
2 : 4
3 : 8
4 : 34
5 : 353
6 : 653
7 : 6463
*/

// 動作オプション指定の場合。

$names = array("a1", "A6", "a2", "B1");
sort($names, SORT_NATURAL | SORT_FLAG_CASE);
foreach ($names as $key => $value) {
echo "$key : $value\n";
}

// 実行結果

/*
0 : a1
1 : a2
2 : A6
3 : B1
*/


asort(), arsort()

// asort(連想配列,動作オプション)

$data = ['name' => 'john','age' => 78,'hobby' => 'anime','job' => 'engineer'];
asort($data);
foreach($data as $key => $value){
echo "$key : $value\n";
}

// 実行結果

/*
hobby : anime
job : engineer
name : john
age : 78
*/

// 動作オプション指定

$data = ['name' => 'john','age' => 78,'hobby' => 'anime','job' => 'engineer'];
asort($data,SORT_LOCALE_STRING);
foreach($data as $key => $value){
echo "$key : $value\n";
}

// 実行結果

/*
age : 78
hobby : anime
job : engineer
name : john
*/


ksort(), krsort()

// ksort(連想配列,動作オプション)

$data = ['name' => 'john','age' => 78,'hobby' => 'anime','job' => 'engineer'];
ksort($data);
foreach($data as $key => $value){
echo "$key : $value\n";
}

// 実行結果

/*
age : 78
hobby : anime
job : engineer
name : john
*/

// 動作オプション指定

$data = ['name' => 'john','age' => 78,'hobby' => 'anime','job' => 'engineer'];
ksort($data,SORT_NUMERIC);
foreach($data as $key => $value){
echo "$key : $value\n";
}

// 実行結果

/*
name : john
age : 78
hobby : anime
job : engineer
*/


usort(), uasort(), uksort()

// usort(配列,定義関数)

function comp($a, $b)
{
return strcmp($a["name"], $b["name"]);
}

$names[0]["name"] = "tanaka";
$names[1]["name"] = "suzuki";
$names[2]["name"] = "ueno";

usort($names, "comp");

while (list($key, $value) = each($names)) {
echo "\$names[$key]: " . $value["name"] . "\n";
}

// 実行結果

/*
$names[0]: suzuki
$names[1]: tanaka
$names[2]: ueno
*/

// uasort(配列,定義関数)

function comp($a, $b)
{
return strcmp($a["name"], $b["name"]);
}

$names[0]["name"] = "tanaka";
$names[1]["name"] = "suzuki";
$names[2]["name"] = "ueno";

uasort($names, "comp");

while (list($key, $value) = each($names)) {
echo "\$names[$key]: " . $value["name"] . "\n";
}

// 実行結果

/*
$names[1]: suzuki
$names[0]: tanaka
$names[2]: ueno
*/

function comp($a, $b)

{
return strcmp($a["name"], $b["name"]);
}

$names[0]["name"] = "tanaka";
$names[1]["name"] = "suzuki";
$names[2]["name"] = "ueno";

uksort($names, "comp");

while (list($key, $value) = each($names)) {
echo "\$names[$key]: " . $value["name"] . "\n";
}

// 実行結果

/*
$names[0]: tanaka
$names[1]: suzuki
$names[2]: ueno
*/


array_multisort()

// array_multisort(並び変える配列,対象配列,オプション)

$numbers = array(15, 343, 55, 75);
$new_numbers = array(2, 4, 3, 7);
array_multisort($numbers, $new_numbers);
print_r($numbers);
print_r($new_numbers);

// 実行結果

/*
Array
(
[0] => 15
[1] => 55
[2] => 75
[3] => 343
)
Array
(
[0] => 2
[1] => 3
[2] => 7
[3] => 4
)
*/


array_unique()

// array_unique(配列)

$number = array(18, "17", "34", 343, 34, "38");
$result = array_unique($number);
print_r($result);

// 実行結果

/*
Array
(
[0] => 18
[1] => 17
[2] => 34
[3] => 343
[5] => 38
)
*/


array_reverse()

// array_reverse(配列)

$number = array(56,64,43,3,5,25,2,52);
$result = array_reverse($number);
print_r($result);

// 実行結果

/*
Array
(
[0] => 52
[1] => 2
[2] => 25
[3] => 5
[4] => 3
[5] => 43
[6] => 64
[7] => 56
)
*/


array_shift(), array_pop()


  • array_shift() は配列の先頭から要素を取り出し、


  • array_pop() は配列の末尾から要素を取り出す。


  • 元の配列は取り出された分短くなる。


  • 公式マニュアル


  • 公式マニュアル


// array_shift(配列)

$names = array('佐藤','高橋','鈴木','田中','黒川');
$result = array_shift($names);
print_r($names);

// 実行結果

/*
Array
(
[0] => 高橋
[1] => 鈴木
[2] => 田中
[3] => 黒川
)
*/

// array_pop(配列)

$names = array('佐藤','高橋','鈴木','田中','黒川');
$result = array_pop($names);
print_r($names);

// 実行結果

/*
Array
(
[0] => 佐藤
[1] => 高橋
[2] => 鈴木
[3] => 田中
)
*/


array_walk(), array_walk_recursive()

// array_walk(配列,定義関数,引数オプション)

$array = array(10,20,30,40,50);
function ten_add (&$i) {
$i += 10;
}
array_walk($array,'tenAdd');
print_r($array);

// 実行結果

/*
Array
(
[0] => 20
[1] => 30
[2] => 40
[3] => 50
[4] => 60
)
*/

// array_walk_recursive(配列,定義関数,引数オプション)

$data = array('name' => '佐藤', 'age' => '67');
$info = array('company' => $data, 'friend' => 'たくさん');

function show_info($item, $key)
{
echo "$key : $item\n";
}

array_walk_recursive($info, 'show_info');

// 実行結果

/*
name : 佐藤
age : 67
friend : たくさん
*/


array_search()


  • 指定要素を配列から検索。


  • 見つかった場合キー(要素番号)を返し、見つからなかった場合、falseを返す。


  • 「型チェックオプション」は省略可能だが、型判定をきちんと行うために、指定する。


  • 公式マニュアル


// array_search(検索値,配列,型チェックオプション)

$names = ['佐藤', '鈴木', '田中'];
$result = array_search('佐藤', $names,TRUE);
print_r($result);

// 実行結果

// 0

$names = ['佐藤', '鈴木', '田中'];

$result = array_search('高橋', $names,TRUE);
echo $result;

// 実行結果

// (false)


implode(), explode()


  • implode() は指定された区切り文字をもとに配列を文字列として結合。


  • 指定配列は一次元配列である必要がある。


  • explode() は指定された区切り文字を元に文字列を配列に変換する。


  • 公式マニュアル


  • 公式マニュアル


// implode(区切り文字,配列)

$names = ['佐藤', '田中', '鈴木'];
$result = implode(',', $names);
echo $result;

// 実行結果

// 佐藤,田中,鈴木

<?php

// explode ( 区切り文字列 , 対象の文字列 ,最大要素数 )

// 例1. 最大要素数指定なし。
$arrayDayList = explode("/","2019/02/28");
print_r($arrayDayList);

// 例2. 最大指定数指定あり。
$arrayEnglish = explode("/","A/B/C/D/E",2);
print_r($arrayEnglish);

// 実行結果

/*
Array
(
[0] => 2019
[1] => 02
[2] => 28
)
*/


range()

// range(開始値,終了値,要素毎の増加数)

// 増加数指定無しの場合
foreach (range(0, 12) as $number) {
echo $number;
}

// 実行結果

// 0123456789101112

// 増加数指定有りの場合
foreach (range('a', 'z',5) as $english) {
echo $english;
}

// 実行結果

// afkpuz


current()

// next($配列)

$names = array( "佐藤", "鈴木" , "田中" );
$name = current($names);
echo "$name";

// 実行結果

// 佐藤


next(), prev()

// next($配列)

// prev($配列)

$names = array( "佐藤", "鈴木" , "田中" );
$name = current($names);
echo "$name\n";
next($names);
$name = current($names);
echo "$name\n";
prev($names);
$name = current($names);
echo "$name";

// 実行結果

/*
佐藤
鈴木
佐藤
*/


reset(), end()


  • reset()は配列のポインタを先頭の要素へ初期化し、その値を取得。


  • reset()は配列のポインタを最後の要素へ進めて、その値を取得。


  • 配列の最初や最後の要素を取得する目的で使うことが多い。


  • 公式マニュアル


  • 公式マニュアル


// reset($配列)

// end($配列)

$names = array( "佐藤", "鈴木" , "田中" );
$name = current($names);
echo "$name\n";
$names = array( "佐藤", "鈴木" , "田中" );
$name = next($names);
echo "$name\n";
$names = array( "佐藤", "鈴木" , "田中" );
$name = reset($names);
echo "$name\n";
$names = array( "佐藤", "鈴木" , "田中" );
$name = end($names);
echo "$name";

// 実行結果

/*
佐藤
鈴木
佐藤
田中
*/


extract()


  • 配列を複数の変数に展開する。


  • 引数に指定できるオプションは、「EXTR_OVERWRITE」以外にもたくさんある。


  • ※信頼できない「$_GET」「$_POST」「$_FILES」には、絶対使わない


  • 公式マニュアル


// extract($配列);

$data = array(
"name" => "佐藤",
"age" => "68",
"hobby" => "アイドル鑑賞"
);
extract($data);
echo "名前 : {$name}";

// 実行結果

// 名前 : 佐藤

// 「EXTR_OVERWRITE」オプションを指定して、既存の変数を上書き。

$name = '田中';

$data = array(
"name" => "佐藤",
"age" => "68",
"hobby" => "アイドル鑑賞"
);
extract($data,EXTR_OVERWRITE);
echo "名前 : {$name}";

// 実行結果

// 名前 : 佐藤


list()


  • 配列の値を、複数の変数に代入。


  • 厳密には関数ではなく言語構造である。


  • 公式マニュアル


// list(変数) = 配列

$data = array('佐藤', '12', '読書');
list($name, $age, $hobby) = $data;
echo "名前 : " . $name;

// 実行結果

// 名前 : 佐藤

$names = ['佐藤','田中','鈴木','鈴木','小松'];

$items = ['item1', 'item2', 'item3'];

list($names[0], $names[2]) = $items;

print_r($names);

// 実行結果

/*
Array
(
[0] => item1
[1] => 田中
[2] => item2
[3] => 鈴木
[4] => 小松
)
*/


is_array()

// is_array(変数)

$data = array("東京","大阪","福岡");
is_array($data)
if (is_array($data) ) {
 echo "配列です";
} else {
 echo "配列ではありません";
}

// 実行結果

// 配列です


まとめ


  • 今回は、PHP関数メモの第二回目ということで、「この整理が完了しても、常に大量の情報を欲している検索魔のため、この予防運動は無意味である」という突き付けられた運命を受け入れながら、記事を書く。

  • 公式マニュアル」や「逆引き大全」での膨大な量から、すかさず逃避して「ネットの参考記事の項目をそのまま使う」という、他人依存優等生をこの上なく発揮。

  • 「とはいえ、この関数整理も残り少なくなってくると、愛着がわき、さびしいものだ」という、医学的にも解明されている人間的思考に、しっかり陥りながら、次の整理をすることにしよう。


参考