2009-08-28 142 views
8

我要尋找一個在PHP這樣做的簡潔方式:PHP:追加如果鍵已經存在的值,如果不添加鍵值

給出一個數組,如果我添加一個 key=>value對吧

中,例程應該檢查密鑰是否已經存在。

如果不存在,請使用key=>value對添加到數組中。

如果是這樣,那麼值應該追加到數組的值。因此,舉例來說,如果初始排列是這樣的

arr['a']='2e' 

當我添加'a'=>'45'對到數組,那麼該程序將返回我

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

當我添加另一個'a=>gt'對吧,那麼例程將返回我

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

有沒有一個簡潔的方式做到這一點?當然,我可以自己寫,但我相信我的解決方案非常難看。

+0

你應該澄清一些事情,你真的想在開始的時候arr ['a'] ='2e',還是它是一個錯字,你期望arr ['a'] = array('2e ')? –

+0

兩者都會做 - 我不在乎哪種情況 – Graviton

回答

17

你可以解決這個問題,通過使用第一個元素( 「2E」)的數組藏漢:

$arr = array(); 

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

print_r($arr); 
+0

+1這也會給你一個一致的結果。 – soulmerge

0

你需要寫一個函數來做到這一點。或者將第一個元素初始化爲一個數組,並使用array_push函數添加新元素。

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

有三種情況:

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

這只是這是棘手的最後一種情況:如果它不是一個數組的是,你需要使用當前值加上新的組成之一。

+0

+1是爲了明確每個街區的功能。 – Residuum

+0

請注意,此函數不會返回任何內容,因此返回該數組或在參數列表中使用'&$ array'會很好。 – Volvox

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); 
4
function update_keypair($arr, $key, $val) 
{ 
    if(empty($arr[$key])) $arr[$key] = array($val); 
    else $arr[$key][] = $val; 
} 

不正是你想要的東西。

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.phphttp://us3.php.net/manual/en/class.arrayaccess.php

相關問題