我希望找到一个优雅的解决方案嵌套数组访问没有抛出未定义的索引错误,并且这篇文章在谷歌上高点。我迟到了参加派对,但我想为未来的参观者考虑。
简单的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();
}
}
尝试$ value = $ array [$ path]; – Pupil
我试过了,但它解释了$ array [['a'] ['b'] ['c']]。所以它不适用于我 –
'$ path = ['a'] ['b'] ['c']'是无效的PHP语法。它是一个字符串吗? –