PHP:如果密钥已存在,则追加值,如果不添加密钥

时间:2009-08-28 10:13:26

标签: php arrays

我在PHP中寻找一种简洁的方法:

给定一个数组,如果我向它添加一个key=>value对,例程应该检查密钥是否已经存在。

如果不存在,请使用key=>value对添加到数组中。

如果是,则该值应附加到数组的值。因此,例如,如果初始数组是这个

arr['a']='2e'

当我向数组添加'a'=>'45'对时,例程将返回

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

当我向其添加另一个'a=>gt'对时,例程将返回

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

这样做有简洁的方法吗?当然我可以自己写,但我相信我的解决方案非常难看。

7 个答案:

答案 0 :(得分:20)

您可以通过使用第一个元素(“2e”)的数组来解决问题:

$arr = array();

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

print_r($arr);

答案 1 :(得分:12)

有三种情况:

  1. 密钥未定义
  2. 已定义键,但尚未设置为数组
  3. 键已定义,元素为数组。
  4. 所以,在代码中:

    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;
    }
    

    这只是最后一个棘手的案例:如果它还不是一个数组,你需要使用当前值和新值组成一个。

答案 2 :(得分:4)

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

完全符合您的要求。

答案 3 :(得分:0)

你需要编写一个能够做到这一点的函数。或者将第一个元素初始化为数组,并使用array_push函数添加新元素。

$a = array('2e');
array_push($a, '45');
array_push($a, 'gt');

答案 4 :(得分: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);

答案 5 :(得分:0)

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

那样的东西?您可以通过将第一个值添加为单元素数组或使用ternar运算符来简化此操作,但无论如何您需要一个自定义函数来完成这项工作。

答案 6 :(得分: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.phphttp://us3.php.net/manual/en/class.arrayaccess.php