Dựa trên Ugo Méda's response:
Phiên bản này
- cho phép bạn sử dụng nó chỉ như một getter (rời khỏi mảng nguồn bị ảnh hưởng)
- sửa chữa các vấn đề lỗi nghiêm trọng nếu một giá trị không phải là mảng được gặp (
Cannot create references to/from string offsets nor overloaded objects
)
không lỗi nghiêm trọng ví dụ
$a = ['foo'=>'not an array'];
arrayPath($a, ['foo','bar'], 'new value');
$a
tại là
array(
'foo' => array(
'bar' => 'new value',
),
)
Sử dụng như một getter
$val = arrayPath($a, ['foo','bar']); // returns 'new value'/$a remains the same
Set giá trị null
$v = null; // assign null to variable in order to pass by reference
$prevVal = arrayPath($a, ['foo','bar'], $v);
$prevVal
là "giá trị mới"
$a
tại là
array(
'foo' => array(
'bar' => null,
),
)
/**
* set/return a nested array value
*
* @param array $array the array to modify
* @param array $path the path to the value
* @param mixed $value (optional) value to set
*
* @return mixed previous value
*/
function arrayPath(&$array, $path = array(), &$value = null)
{
$args = func_get_args();
$ref = &$array;
foreach ($path as $key) {
if (!is_array($ref)) {
$ref = array();
}
$ref = &$ref[$key];
}
$prev = $ref;
if (array_key_exists(2, $args)) {
// value param was passed -> we're setting
$ref = $value; // set the value
}
return $prev;
}
Nguồn
2016-03-16 17:02:36
Điều đó thật tuyệt vời. :) Cảm ơn alexisdm! – Anthony
Có cách nào để lấy giá trị thay vì cài đặt không? –
@MaraisRossouw nhận xét/câu hỏi của bạn cũ, nhưng hãy xem http://stackoverflow.com/a/36042293/1371433 nó hoạt động như getter và/hoặc setter –