我在PHP中寻找一种简洁的方法:
给定一个数组,如果我向它添加一个key=>value
对,例程应该检查密钥是否已经存在。
如果不存在,请使用key=>value
对添加到数组中。
如果是,则该值应附加到数组的值。因此,例如,如果初始数组是这个
arr['a']='2e'
当我向数组添加'a'=>'45'
对时,例程将返回
arr['a']=array('2e', '45')
当我向其添加另一个'a=>gt'
对时,例程将返回
arr['a']=array('2e', '45','gt')
这样做有简洁的方法吗?当然我可以自己写,但我相信我的解决方案非常难看。
答案 0 :(得分:20)
您可以通过使用第一个元素(“2e”)的数组来解决问题:
$arr = array();
$arr['a'][] = '2e';
$arr['a'][] = '45';
$arr['a'][] = 'gt';
print_r($arr);
答案 1 :(得分:12)
有三种情况:
所以,在代码中:
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.php,http://us3.php.net/manual/en/class.arrayaccess.php)