私は未定義のインデックスエラーをスローせずに、ネストされた配列のアクセスにエレガントな解決策を見つけることを期待していた、とこの記事は、Googleで高いヒット。私はパーティーに遅れていますが、私は将来の訪問者のために体重を増やしたいと思いました。
単純なisset($array['a']['b']['c']
は、ネストされた値を安全にチェックできますが、アクセスする要素を事前に知る必要があります。多次元配列にアクセスするためのドット表記が気に入っているので、私は自分のクラスを書きました。 PHP 5.6が必要です。
このクラスは、ドット表記で書かれた文字列パスを解析し、配列や配列のようなオブジェクト(ArrayAccessを実装)のネストされた値に安全にアクセスします。値を返すか、設定されていなければNULLを返します。
use ArrayAccess;
class SafeArrayGetter implements \JsonSerializable {
/**
* @var array
*/
private $data;
/**
* SafeArrayGetter constructor.
*
* @param array $data
*/
public function __construct(array $data)
{
$this->data = $data;
}
/**
* @param array $target
* @param array ...$indices
*
* @return array|mixed|null
*/
protected function safeGet(array $target, ...$indices)
{
$movingTarget = $target;
foreach ($indices as $index)
{
$isArray = is_array($movingTarget) || $movingTarget instanceof ArrayAccess;
if (! $isArray || ! isset($movingTarget[ $index ])) return NULL;
$movingTarget = $movingTarget[ $index ];
}
return $movingTarget;
}
/**
* @param array ...$keys
*
* @return array|mixed|null
*/
public function getKeys(...$keys)
{
return static::safeGet($this->data, ...$keys);
}
/**
* <p>Access nested array index values by providing a dot notation access string.</p>
* <p>Example: $safeArrayGetter->get('customer.paymentInfo.ccToken') ==
* $array['customer']['paymentInfo']['ccToken']</p>
*
* @param $accessString
*
* @return array|mixed|null
*/
public function get($accessString)
{
$keys = $this->parseDotNotation($accessString);
return $this->getKeys(...$keys);
}
/**
* @param $string
*
* @return array
*/
protected function parseDotNotation($string)
{
return explode('.', strval($string));
}
/**
* @return array
*/
public function toArray()
{
return $this->data;
}
/**
* @param int $options
* @param int $depth
*
* @return string
*/
public function toJson($options = 0, $depth = 512)
{
return json_encode($this, $options, $depth);
}
/**
* @param array $data
*
* @return static
*/
public static function newFromArray(array $data)
{
return new static($data);
}
/**
* @param \stdClass $data
*
* @return static
*/
public static function newFromObject(\stdClass $data)
{
return new static(json_decode(json_encode($data), TRUE));
}
/**
* Specify data which should be serialized to JSON
* @link http://php.net/manual/en/jsonserializable.jsonserialize.php
* @return array data which can be serialized by <b>json_encode</b>,
* which is a value of any type other than a resource.
* @since 5.4.0
*/
function jsonSerialize()
{
return $this->toArray();
}
}
try $ value = $ array [$ path]; – Pupil
私は試みましたが、$ array [['a'] ['b'] ['c']]のようなものを解釈します。それは私のためには機能しません –
'$ path = ['a'] ['b'] ['c']'は有効なPHP構文ではありません。それは文字列ですか? –