speravo di trovare una soluzione elegante per l'accesso array nidificato senza gettare errori indice indefiniti, e questo post colpisce alto su google. Sono in ritardo per la festa, ma volevo pesare per i futuri visitatori.
Un semplice isset($array['a']['b']['c']
può controllare in sicurezza i valori nidificati, ma è necessario conoscere gli elementi per accedere in anticipo. Mi piace la notazione dot per l'accesso a array multidimensionali, quindi ho scritto una classe a mia volta. Richiede PHP 5.6.
Questa classe analizza un percorso di stringa scritto in dot-notation e accede in modo sicuro ai valori nidificati dell'array o dell'oggetto simile all'array (implementa ArrayAccess). Restituirà il valore o NULL se non impostato.
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
Ho provato ma interpreta qualcosa come $ array [['a'] ['b'] ['c']]. Quindi non funziona per me –
'$ path = ['a'] ['b'] ['c']' non è una sintassi PHP valida. È una stringa? –