Ich hatte gehofft, eine elegante Lösung für den geschachtelten Array-Zugriff zu finden, ohne undefinierte Indexfehler zu werfen, und dieser Beitrag trifft hoch auf Google. Ich bin zu spät zur Party, aber ich wollte mich für zukünftige Besucher einbringen.
Eine einfache isset($array['a']['b']['c']
kann geschachtelte Werte sicher überprüfen, aber Sie müssen die Elemente kennen, auf die Sie im Voraus zugreifen können. Ich mag die Punktnotation für den Zugriff auf mehrdimensionale Arrays, also schrieb ich eine eigene Klasse. Es erfordert PHP 5.6.
Diese Klasse analysiert einen in Punktnotation geschriebenen Zeichenfolgenpfad und greift sicher auf die verschachtelten Werte des Arrays oder arrayähnlichen Objekts zu (implementiert ArrayAccess). Es wird den Wert oder NULL zurückgeben, wenn nicht festgelegt.
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();
}
}
versuchen $ value = $ array [$ pfad]; – Pupil
Ich habe versucht, aber es interpretiert etwas wie $ array [['a'] ['b'] ['c']]. So funktioniert es nicht für mich –
'$ path = ['a'] ['b'] ['c']' ist nicht gültig PHP-Syntax. Ist es eine Schnur? –