/** * 指定された配列から要素を取得します。 * * キーにドット区切りの文字列を与えると、多次元配列の任意の階層を指定できます。 * * 例えば、第一引数に$array、第二引数に"deep.deep.index"を指定した時は、 * $array["deep"]["deep"]["index"]を参照します。 * * 指定された要素を取得できない場合は$defaultに指定された値を返します。 * * $value = Arr::get($array, "deep.deep.index"); // これは * $value = $array["deep"]["deep"]["index"]; // これと同じことです。 * * // しかし $array["deep"]["deep"]["index"]が存在しなければ後者はエラーを発しますが * // Arr::get()ではnullが返され、エラーは起きません。 * * @param array $array 操作する配列 * @param mixed|null $key 取得するインデックス * @param mixed|null $default 初期値。デフォルト値はnull * @return mixed */ public static function get(array $array, $key = null, $default = null) { if ($key === null) { // keyがnullなら配列をそのまま返す return $array; } if (is_array($key)) { $ar = array(); foreach ($key as $v) { Arr::set($ar, $v, Arr::get($array, $v, $default)); } return $ar; } if (is_int($key)) { // key数値ならindexが存在するかチェックして適切な値を返す return isset($array[$key]) ? $array[$key] : $default; } $path = explode(".", $key); $index = array_pop($path); $pt =& $array; // 多次元配列を掘る foreach ($path as $k) { if (isset($pt[$k]) and is_array($pt[$k])) { $pt =& $pt[$k]; } else { return $default; } } return isset($pt[$index]) ? $pt[$index] : $default; }
/** * @covers \CodeLapse\Arr::set */ public function testSet() { $arr = array(); $expected = 'value'; Arr::set($arr, 'key', $expected); $this->assertEquals($arr['key'], $expected, 'setテスト'); $expected = 'value'; Arr::set($arr, 'key.deep', $expected); $this->assertTrue(isset($arr['key']['deep']), '多次元配列の値設定テスト'); $this->assertEquals(Arr::get($arr, 'key.deep'), $expected, '多次元配列の値設定テスト'); }
/** * $_FILES内から配列形式のファイル情報を取得します。 * @param string $name 複数のアップロードファイル情報を持つ$_FILESの要素のキー名 * @return CodeLapse\Upload[] */ public static function getArrayFiles($name) { $rawFileInfos = Arr::get($_FILES, $name); $errors = Arr::get($rawFileInfos, 'error'); if (!is_array($errors)) { return []; } $files = []; foreach ($rawFileInfos as $attr => $values) { foreach ($values as $index => $value) { Arr::set($files, "{$index}.{$attr}", $value); } } $instances = []; foreach ($files as $f) { if (!self::validFile($f)) { continue; } $instances[] = new self($f); } return $instances; }