PHP:如果键已经存在,则将值附加到该键,如果不存在,则添加该键。

17
我正在寻找一种简洁的PHP方法:
给定一个数组,如果我向其中添加一个key=>value对,则程序应检查该键是否已存在。
如果不存在,则将其添加到数组中,包括key=>value对。
如果存在,则值应追加到数组的值。例如,如果初始数组如下:
arr['a']='2e'

当我向数组中添加一个'a'=>'45'的键值对时,该程序会返回我

arr['a']=array('2e', '45')

当我给它添加另外一个'a=>gt'的配对后,这个程序将会返回给我

arr['a']=array('2e', '45','gt')

有没有简洁的方法来实现这个?当然我可以自己写,但我认为我的解决方案非常丑陋。

有没有更简单的方法实现这个?虽然我可以自己写,但是我觉得我的解决方案很丑。


你应该澄清一些事情,你真的想在开头设置 arr['a']='2e' 吗?还是这是一个打字错误,你期望 arr['a']=array('2e')? - Bite code
两者都可以——我不在意哪种情况。 - Graviton
7个回答

30
你可以通过为第一个元素(“2e”)使用数组来解决这个问题:
$arr = array();

$arr['a'][] = '2e';
$arr['a'][] = '45';
$arr['a'][] = 'gt';

print_r($arr);

很好,如果键['a']不存在并最终创建该键,它不会抛出任何提示/警告。 - Deepak Rajpal

14

有三种情况:

  1. 键未定义
  2. 键已定义,但尚未设置为数组
  3. 键已定义,并且元素是数组。

所以,在代码中:

function appendThings(/* map[string,mixed] */ $array, /* string */ $key, /* string */ $value) {
    if (!isset($array[$key]))
        $array[$key] = $value;
    else if (is_array($array[$key]))
        $array[$key][] = $value;
    else
        $array[$key] = array($array[$key], $value);

    return $array;
}

只有最后一种情况比较棘手:如果它还不是一个数组,你需要使用当前值加上新值来组成一个。


请注意,该函数没有返回任何内容,因此最好将此数组返回或在参数列表中使用&$array - Volvox

3
function update_keypair($arr, $key, $val)
{
   if(empty($arr[$key])) $arr[$key] = array($val);
   else $arr[$key][] = $val;
}

它能够完全满足您的需求。


0
你需要编写一个函数来完成这个任务。或者把你的第一个元素初始化为一个数组,然后使用array_push函数添加新元素。
$a = array('2e');
array_push($a, '45');
array_push($a, 'gt');

0

试试这个

$key="a";
$value="b";
$array=array();

if(!array_key_exists($key,$array)) $array[$key]=$value;
elseif(is_array($array[$key]))$array[$key][]=$value;
else $array[$key]=array($array[$key],$value);

0
if (isset($array[$key]) {
  if (!is_array($array[$key]))
    $array[$key] = (array)$array[$key];
  $array[$key][] = $new_value;
} else {
  $array[$key] = $new_value;
}

这样行吗?你可以通过将第一个值添加为一个元素数组或使用三元运算符来简化它,但无论如何,你都需要一个自定义函数来完成这项工作。


0

严格数组:

$arr['a']=(is_array($arr['a'])? '2e' : array_merge(Array('2e'),$arr['a']));

带分隔符的字符串:

$arr['a'].='2e'.'/'; // '/' is used as a separator in here.

如果您需要将字符串作为数组使用,只需执行$arr['a'] = explode("/",$arr['a']);

这两种方法都很丑陋...您应该尝试像FlorianH建议的那样使用整个变量作为数组。

另一种方法可能是使用PHp中的接口,并构建利用Iterator和ArrayAccess接口的内容。(http://us3.php.net/manual/en/class.iterator.php, http://us3.php.net/manual/en/class.arrayaccess.php)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接