PHP - 如果key不存在,则添加到多维数组

时间:2013-12-01 01:56:18

标签: php arrays

很难弄清楚如何解释它,所以代码可能会有所帮助。

$out = array();

source_addValue($out['sources']['site1']['user_id'], '12345');
source_addValue($out['sources']['site1']['username'], 'testuser');
source_addValue($out['sources']['site1']['address']['state'], 'CA');

function source_addValue($field, $value) {
    global $out;
    if (!$field) $field = $value;
}

那,或者因为$out['sources']部分保持不变,可能是这样的:

$out = array();

source_addValue('site1', 'user_id', '12345');
source_addValue('site1', 'username', 'testuser');
source_addValue('site1', array('address','state'), 'CA');

function source_addValue($site, $field, $value) {
    global $out;
    if (!$out['sources'][$site]$field) $out['sources'][$site]$field = $value;
}

无论哪种方式,我都会挂断该函数,特别是if语句。我只需要能够检查是否已为$out设置了该数组值(能够检查子数组),如果不是,请将其添加到$out数组中

2 个答案:

答案 0 :(得分:1)

我不相信我明白你的意思,但我猜:

function autoVivifyDynamicKeyPath($pathKeys, $val) {
    global $out;
    $cursor =& $out;
    foreach ($pathKeys as $key) {
        if (!isset($cursor[$key]) || !is_array($cursor[$key])) {
            $cursor[$key] = array();
        }
        $cursor =& $cursor[$key];
    }
    $cursor = $val;
}
autoVivifyDynamicKeyPath(array('site1', 'address', 'state'), 'ca');

答案 1 :(得分:0)

Rambo的功能不会检查当前键是否已设置。它会覆盖已有值的所有键。这是一个修改版本,用于检查已存在的密钥

$out = array();

source_addValue(array('sources', 'site1', 'user_id'), '12345');
source_addValue(array('sources', 'site1', 'username'), 'testuser');
source_addValue(array('sources', 'site1', 'address', 'state'), 'CA');

function source_addValue($pathKeys, $val) {
    global $out;
    foreach ($pathKeys as $key) {
        if (!isset($out[$key]) && !is_array($out[$key])) {
            $out[$key] = array();
        }
        $out =& $out[$key];
    }
    if(empty($out)){
        $out = $val;
    }
}

print_r($out);