PHP: добавить значение, если ключ уже существует, если нет, добавить ключ - PullRequest
11 голосов
/ 28 августа 2009

Я ищу краткий способ сделать это в PHP:

учитывая массив, если я добавлю к нему одну key=>value пару, процедура должна проверить, существует ли ключ.

Если его не существует, добавьте в массив пару key=>value.

Если это так, то значение должно быть добавлено к значению массива. Так, например, если начальный массив это

arr['a']='2e'

Когда я добавлю пару 'a'=>'45' в массив, тогда процедура вернет мне

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

Когда я добавлю к ней другую пару 'a=>gt', процедура вернет меня

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

Есть краткий способ сделать это? Конечно, я могу написать сам, но я считаю, что мое решение очень уродливо.

Ответы [ 7 ]

20 голосов
/ 28 августа 2009

Вы можете решить проблему, используя массив для первого элемента ("2e"), а также:

$arr = array();

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

print_r($arr);
12 голосов
/ 28 августа 2009

Существует три ситуации:

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

Это только последний сложный случай: если это еще не массив, вы будетенеобходимо составить один, используя текущее значение плюс новое.

4 голосов
/ 28 августа 2009
function update_keypair($arr, $key, $val)
{
   if(empty($arr[$key])) $arr[$key] = array($val);
   else $arr[$key][] = $val;
}

делает именно то, что вы хотите.

0 голосов
/ 28 августа 2009

Строго массив:

$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)

0 голосов
/ 28 августа 2009
if (isset($array[$key]) {
  if (!is_array($array[$key]))
    $array[$key] = (array)$array[$key];
  $array[$key][] = $new_value;
} else {
  $array[$key] = $new_value;
}

Что-то подобное? Вы, безусловно, можете упростить это, добавив первое значение в виде одноэлементного массива или используя тернарные операторы, но в любом случае вам понадобится пользовательская функция для выполнения этой работы.

0 голосов
/ 28 августа 2009

Попробуйте это

$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 голосов
/ 28 августа 2009

Вам нужно написать функцию, которая делает это. Или также инициализируйте ваш первый элемент как массив и используйте функцию array_push для добавления новых элементов.

$a = array('2e');
array_push($a, '45');
array_push($a, 'gt');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...