FuelPHP

FuelPHPのARRクラス

更新日:

『FuelPHPで会員管理』で、プロフィールの作成及び表示のためのプログラムを作ろうと思ったので、FuelPHPのARRクラスについて調べ直して見ることにしました。SimpleAuthのprofile_fieldsはユーザーのプロフィールの配列をシリアライズ化して、データ保存します。プロフィールの配列情報を操作するためには、配列操作をするために作成されたARRクラスの使い方を覚えれば色々役に立つと思い、調べてみることにしました。

ARRクラスのメソッド

1. 公式サイトによれば、『ARRクラスとは、配列を使用するためのヘルパー関数のセットです』と記述されています。

is_multi(配列,全要素のチェック=false)

第1引数の配列が多次元配列であるかどうかをチェックし、真偽値(trueかfalse)を返します。第2引数をtrue指定すると、全ての要素が多次元配列である場合にのみtureを返します。v1.3の公式ドキュメントにのみあったので、1.3から利用できるメソッドだと思ったのですが、v1.2.1でも使えました。

//これは多次元配列ではありません
 $arr=array('one'=>1,'two'=>2);
 //表示結果はbool(false)です。
 echo "『array('one'=>1,'two'=>2)』は ";
 echo var_dump(Arr::is_multi($arr))." です。<br>";
 //これは多次元配列です。
 $arr=array('one'=>array('test'=>1),'two'=>array('test'=>2),'three'=>array('test'=>3));
 //表示結果はbool(true)です。
 echo "『array('one'=>array('test'=>1),'two'=>array('test'=>2),'three'=>array('test'=>3))』は ";
 echo var_dump(Arr::is_multi($arr))." です。<br>";
 //多次元配列でない配列も含まれています。
 $arr=array('one'=>array('test'=>1),'two'=>array('test'=>2),'three'=>3);
 echo "『array('one'=>array('test'=>1),'two'=>array('test'=>2),'three'=>3)』 の第2引数falseは ";
 //第2引数をfalseにすると表示結果はbool(true)です。
 echo var_dump(Arr::is_multi($arr, false))."<br>";
 echo "『array('one'=>array('test'=>1),'two'=>array('test'=>2),'three'=>3)』 の第2引数trueは ";
 //第2引数をtrueにすると表示結果はbool(false)です。
 echo var_dump(Arr::is_multi($arr, true));

is_assoc(配列)

以前『FuelPHPのコアクラスの概要』で調べたときは、is_assoc()メソッドは存在しませんと書いたのですが、いつの間にか存在していました。is_assocメソッドは、引数の配列が連想配列かどうかをチェックして、真偽値を返します。

//下記は連想配列ではありません。
 $arr=array('foo', 'bar', 'baz', 'yay');
 //表示結果はbool(false)です。
 echo var_dump($arr)."<br>";
 echo var_dump(Arr::is_assoc($arr))."<br>";
 //下記は連想配列です。
 $arr=array('foo'=>'foo','bar'=>'bar','baz'=>'baz','yay'=>'yay');
 //表示結果はbool(true)です。
 echo var_dump($arr)."<br>";
 echo var_dump(Arr::is_assoc($arr))."<br>";
 //数値の中に文字列'2'を指定しても、整数と判断され、連想配列とはみなされません。
 $arr=array(0=>'foo',1=>'bar','2'=>'baz',3 =>'yay');
 echo var_dump($arr)."<br>";
 echo var_dump(Arr::is_assoc($arr))."<br>";
 //ひとつでも完全な文字列を指定すると連想配列とみなされます。
 $arr=array(0=>'foo',1=>'bar','baz'=>'baz',3=>'yay');
 echo var_dump($arr)."<br>";
 echo var_dump(Arr::is_assoc($arr))."<br>";

to_assoc(配列)

to_assocメソッドは、配列が偶数なら連想配列に変換します。

$arr = array('foo', 'bar', 'baz', 'yay');
 echo var_dump(Arr::to_assoc($arr));

『FuelPHPのコアクラスの概要』では、配列内が奇数なら、NULL値を返すと記述しましたが、配列内が奇数の時は、エラーを表示しますので、プログラムの取り扱いには要注意です。

$arr = array('foo', 'bar', 'baz');
 echo var_dump(Arr::to_assoc($arr));

 assoc_to_keyval(配列,キーフィールド,値フィールド)

連想配列から第2引数に指定したフィールドの値をキーとして、第3引数で指定したフィールドの値を値とした連想配列を返します。

$people = array(
 array(
 "name" => "Jack",
 "age" => 21
 ),
 array(
 "name" => "Jill",
 "age" => 23
 )
);
//第2引数nameの値をキーとして第3引数のageの値を値として連想配列に変換
echo var_dump(Arr::assoc_to_keyval($people, 'name', 'age'));

average(配列)

引数の配列内の値の平均値を返します。半角数字ならば、シングルクォーテーションやダブルクォーテーションで括っても数値として認識されます。尚、配列内に文字列があった場合、値が0として認識されるみたいです。下の例では、合計15を文字列を含めた数で割った数字が表示されます。

//合計15÷4=3.75を表示します。
 echo Arr::average(array('1', 2, 4, "8"))."<br>";
 //合計15÷5=3を表示します。
 echo Arr::average(array('1', 2, 4, "8","テスト"));

flatten(多次元配列,接続文字列,リセットの有無=true)

flattenメソッドは、多次元配列のそれぞれの次元のキーを第2引数の文字列で繋いで新しいキーを作成し、新しい1次元配列を作成します。第2引数の初期値は『:(コロン)』です。

$indexed = array(
 array("a"),
 array("b"),
 array("c"),
 );
 //多次元配列を'_'で繋いで1次元配列に変換
 echo var_dump(Arr::flatten($indexed, '_'));

flatten_assoc(多次元連想配列,接続する文字列,リセット=true)

flatten_assocメソッドは、多次元連想配列のそれぞれの次元のキー(連想文字列)を第2引数指定の文字列で繋いで、新しいキーを作成し、新しい1次元連想配列を作成します。

$people = array(
 array(
 "name" => "Jack",
 "age" => 21
 ),
 array(
 "name" => "Jill",
 "age" => 23
 )
 );
 //多次元連想配列をデフォルトの:(コロン)で繋いで、1次元連想配列を表示
 echo var_dump(Arr::flatten_assoc($people));

reverse_flatten(配列,接続文字列)

reverse_flattenメソッドは、第2引数に指定した文字列で接続されている第1引数の1次元配列を多次元配列に戻します。 第2引数の初期値は:(コロン)ですので、第2引数を省略すると:(コロン)が指定されます。

$flattened = array(
 '0_name' => 'James',
 '0_age' => 24,
 '1_name' => 'John',
 '1_age' => 34,
 );
 //第2引数'_'で接続された1次元配列を多次元配列に変換
 echo var_dump(Arr::reverse_flatten($flattened, '_'));

filter_prefixed(連想配列,接頭辞,接頭辞の削除=true)

このメソッドは、第1引数の連想配列から第2引数で指定した接頭辞で始まる連想配列を抽出します。第3引数は接頭辞を削除するかどうかを指定します。初期値はtrueですので、第3引数を省略すれば、接頭辞を削除した連想配列が返ります。

$arr = array(
 "user_name" => "John",
 "user_surname" => "Lastname",
 "project_name" => "Fuel",
 "project_type" => "Framework",
 );
 //接頭辞"user_"の配列から接頭辞を削除した連想配列を抽出します。
 echo var_dump(Arr::filter_prefixed($arr, "user_"))."<br>";
 //接頭辞"project_"の配列の連想配列を抽出します。
 echo var_dump(Arr::filter_prefixed($arr, "project_", false));

remove_prefixed(配列,接頭辞)

このメソッドは、第1引数の配列から第2引数の接頭辞で始まる配列を削除した配列を返します。 このメソッドはv1.3から使用されるメソッドみたいで、v1.2.1ではエラーが表示されました。

$arr = array(
 "user_name" => "John",
 "user_surname" => "Lastname",
 "project_name" => "Fuel",
 "project_type" => "Framework",
 );
 //接頭辞projectで始まる配列を削除して表示します。
 echo var_dump(Arr::remove_prefixed($arr, "project"));

filter_keys(配列,キーの配列,削除=false)

このメソッドは、キーのセットに指定された配列を抽出します。第3引数にtrueを指定すると第2引数に指定したキーのセットを削除します。

$arr = array(
 "user_name" => "John",
 "user_surname" => "Lastname",
 "project_name" => "Fuel",
 "project_type" => "Framework",
 );
 //第2引数をキーとする配列を抽出します。
 echo var_dump(Arr::filter_keys($arr, array('project_name', 'user_name')))."<br>";
 //第2引数を削除した残りの配列を抽出します。
 echo var_dump(Arr::filter_keys($arr, array('user_name', 'user_surname'), true));

get(配列,キー,初期値=false)

このメソッドは、第1引数の配列から、第2引数をキーとする値を取得します。もし見つからない場合は第3引数に指定した値を返します。又、(.)ドットで繋ぐことで、多次元配列内の値も取得することが出来ます。

$person = array(
 "name" => "Jack",
 "age" => "21",
 "location" => array(
 "city" => "Pittsburgh",
 "state" => "PA",
 "country" => "US"
 )
 );
 //"name"をキーとする値"Jack"を表示します。
 echo Arr::get($person, "name", "Unknown Name")."<br>";
 //"job"をキーとする値が見つからないので、第3引数を表示します。
 echo Arr::get($person, "job", "Unknown job")."<br>";
 // "location"配列内の"city"をキーとする値"Pittsburgh"を表示します。
 echo Arr::get($person, "location.city", "Unknown City")."<br>";

set(参照渡しの配列,キー又は配列,値=null)

このメソッドは、第1引数の配列を参照渡しで、第2引数をキー、第3引数を値として、配列にセットします。第2引数に配列を指定すると第3引数は無視されます。

$person = array(
 "name" => "Jack",
 "age" => "21",
 "location" => array(
 "city" => "Pittsburgh",
 "state" => "PA",
 "country" => "US"
 )
 );
 //元の配列を表示
 echo var_dump($person)."<br>";
 //"name"を"John"に変更した値をセット
 Arr::set($person, "name", "John");
 echo var_dump($person)."<br>";
 //多次元配列内のlocation.cityを"Philadelphia"に変更してセット
 Arr::set($person, "location.city", "Philadelphia");
 echo var_dump($person)."<br>";
 //第2引数を連想配列としてセット
 Arr::set($person, array("name" => "John", "location.city" => "Philadelphia"));
 echo var_dump($person);

pluck(配列,キー,index=null)

このメソッドは、第1引数の配列から第2引数をキーとした値を配列として取得します。このメソッドは、v.1.3から利用できるようになるみたいです。v1.2.1ではエラーが表示されました。

$collection = array(
 array(
 'id' => 2,
 'name' => 'Bill',
 'surname' => 'Cosby',
 ),
 array(
 'id' => 5,
 'name' => 'Chris',
 'surname' => 'Rock',
 ),
 array(
 'id' => 7,
 'name' => 'Bert',
 'surname' => 'Visser',
 ),
 );
// array(2, 5, 7)が表示されます。
 $ids = \Arr::pluck($collection, 'id');
 echo var_dump($ids)."<br>";
 // array(2 => 'Bill', 5 => 'Chris', 7 => 'Bert')が表示されます
 $names = \Arr::pluck($collection, 'name', 'id');
 echo var_dump($names)."<br>";

delete(配列,キー)

このメソッドは、配列から、キーに該当する値を削除します。又、キーは(.)ドットでつなげて、多次元配列を指定することも出来ます。削除が成功した場合はtrueを、失敗した場合はfalseを返します。又、キーは配列で複数同時に指定することも出来ます。

$person = array(
 "name" => "Jack",
 "age" => "21",
 "location" => array(
 "city" => "Pittsburgh",
 "state" => "PA",
 "country" => "US"
 )
);
//元の値を表示
echo var_dump($person)."<br>";
//配列から"name"を削除
$result = Arr::delete($person, "name");
//削除が成功したので、trueを表示
echo var_dump($result)."<br>";
echo var_dump($person)."<br>";
//location配列内のcityを削除
$result = Arr::delete($person, "location.city");
//削除が成功したので、trueを表示
echo var_dump($result)."<br>";
echo var_dump($person)."<br>";
//"name"は上で削除されているので、false、location.doesnotexistは存在しないので、falseがを表示
$result = Arr::delete($person, array("name", "location.doesnotexist"));
echo var_dump($result)."<br>";
echo var_dump($person);

insert(配列,値、挿入位置)

このメソッドは、配列に値を挿入します。挿入位置をキー番号(数値)で入力します。

$people = array("Jack", "Jill");
 echo "元の配列を表示<br>";
 echo var_dump($people)."<br><br>";
Arr::insert($people, "Humpty", 0);
 echo "Hmuptyを0番目に挿入<br>";
 echo var_dump($people)."<br><br>";
Arr::insert($people, array("Hansel", "Gretel"), 1);
 echo '"Hansel"と"Gretel"を1番目に挿入<br>';
 echo var_dump($people)."<br><br>";
Arr::insert($people, array( array("name" => "Wolf", "teeth" => "sharp")), 0);
 echo "nameがWolfでteethがsharpの連想配列を0番目に挿入<br>";
 echo var_dump($people)."<br>";

insert_before_key(配列,値,キー)

このメソッドは、指定配列に第2引数の値を第3引数指定のキー番号の前に挿入します。

$people = array("Jack", "Jill");
 //元の配列を表示
 echo "元の配列<br>";
 echo var_dump($people)."<br><br>";
 //値"Hmpty"をキー1(つまりJill)の前に挿入します。
 Arr::insert_before_key($people, "Humpty", 1);
 //挿入後の配列を表示
 echo "挿入後の配列<br>";
 echo var_dump($people);

insert_after_key(配列,値,キー)

このメソッドは、指定配列に第2引数の値を第3引数指定のキー番号の後に挿入します。

$people = array("Jack", "Jill");
//元の配列を表示
echo "元の配列<br>";
echo var_dump($people)."<br><br>";
//値"Hmpty"をキー1の後に挿入
Arr::insert_after_key($people, "Humpty", 1);
//挿入後の配列を表示
echo "挿入後の配列<br>";
echo var_dump($people);

insert_after_value(配列,値,検索)

このメソッドは、第1引数の配列に第2引数の値を第3引数の検索値の後に挿入します。成功すればtrue、失敗すれがfalseが返ります。

$people = array("Jack", "Jill");
//元の配列を表示
echo "元の配列<br>";
echo var_dump($people)."<br><br>";
//値"Hmpty"を検索値"Jack"の後に挿入します。
$result=Arr::insert_after_value($people, "Humpty", "Jack");
//挿入後の配列を表示
echo "挿入後の配列<br>";
echo var_dump($people)."<br><br>";
//結果を表示
echo "挿入の結果<br>";
echo var_dump($result);

sort(配列,キー,並び順,$sort_flags=SORT_REGULAR)

このメソッドは、第1引数の配列を第2引数のキーの値を並び替えます。第3引数は'asc'(昇順)か、'desc'(降順)で指定します。初期値は'asc'ですので、第3引数を省略すると昇順で並び替えます。多次元配列のキーは(.)ドットで繋いで指定します。

$data = array(
 array(
 'info' => array(
 'pet' => array(
 'type' => 'dog'
 ))),
 array(
 'info' => array(
 'pet' => array(
 'type' => 'fish'
 ))),
 array(
 'info' => array(
 'pet' => array(
 'type' => 'cat'
 ))),
);
//元の配列を表示
echo "元の配列<br>";
echo var_dump($data)."<br><br>";
//多次元配列の中のtypeを並び替えます。
$data = Arr::sort($data, 'info.pet.type');
//並び替え後の配列を表示
echo "並び替え後の配列<br>";
echo var_dump($data);

multisort(多次元配列,複数ソート条件,大文字小文字の区別=false)

このメソッドは、第1引数の多次元配列を第2引数の複数のソート条件に基づいて並び替えます。第3引数はソート順に大文字小文字を区別するかどうかを指定します。初期値はfalseですので、大文字小文字の区別はしません。これはv1.3以降のメソッドみたいです。v1.2.1ではエラーが表示されました。

$collection = array(
 'i5' => array(
 'name' => 'Carl',
 'age' => 17,
 'points' => 30,
 'arr' => array(
 'key' => 10,
 ),
 ),
 'i7' => array(
 'name' => 'carl',
 'age' => 17,
 'points' => 20,
 'arr' => array(
 'key' => 10,
 ),
 ),
 'i2' => array(
 'name' => 'Bert',
 'age' => 20,
 'points' => 30,
 'arr' => array(
 'key' => 10,
 ),
 ),
);
//元の配列を表示
echo "元の配列<br>";
echo var_dump($collection)."<br><br>";
$collection = \Arr::multisort($collection, array(
 'name' => SORT_ASC,
 'points' => array(SORT_ASC, SORT_NUMERIC),
 'age' => array(SORT_ASC, SORT_NUMERIC),
), true);
//並び替え後の配列を表示
echo "並び替え後の配列<br>";
echo var_dump($collection);

in_array_recursive($needle,$haystack,$strict=false)

済みません。このメソッドの意味がいまいち理解できませんでした。

手続きヘルパー

in_arrayi(検索値,検索元の配列)

この関数は、PHPのin_array関数の大文字小文字を区別しないバージョンです。第2引数の配列から第1引数の値を検索して、値があった場合はtrue、無かった場合はfalseを返します。

$data=array('something','tHis');

 //in_arrayの場合(大文字小文字の区別有り)
 echo "in_arrayの場合<br>";
 echo var_dump(in_array('This',$data))."<br><br>";
 //in_arrayiの場合(大文字小文字の区別なし)
 echo "in_arrayiの場合<br>";
 echo var_dump(in_arrayi('This',$data))."<br><br>";

これで一部のメソッドを除き、ほとんど理解することが出来ました。後は、実践でどう使いこなせるかだと思います。

本日は、以上です。

-FuelPHP
-

Copyright© WinRoad徒然草 , 2018 All Rights Reserved Powered by AFFINGER5.