2009-08-28 31 views
8

Tôi đang tìm kiếm một cách gọn gàng để làm điều này trong PHP:PHP: append để đánh giá cao nếu chìa khóa đã tồn tại, nếu không muốn nói thêm khóa

cho một mảng, nếu tôi thêm một key=>value cặp cho nó, thường xuyên nên kiểm tra xem khóa đã tồn tại chưa.

Nếu nó không tồn tại, hãy thêm vào mảng với cặp key=>value.

Nếu có, thì giá trị sẽ được thêm vào giá trị của mảng. Vì vậy, ví dụ, nếu mảng ban đầu là thế này

arr['a']='2e' 

Khi tôi thêm một cặp 'a'=>'45' để mảng, sau đó thói quen sẽ trở lại tôi

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

Khi tôi thêm một 'a=>gt' cặp với nó, sau đó thường lệ sẽ trả lại cho tôi

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

Có cách nào ngắn gọn để làm việc này không? Tất nhiên tôi có thể tự viết ra nhưng tôi tin rằng giải pháp của tôi rất xấu.

+0

Bạn nên làm rõ điều gì đó, bạn có thực sự muốn arr ['a'] = '2e' ngay từ đầu hay là lỗi đánh máy và bạn mong đợi arr ['a'] = array ('2e ')? –

+0

Cả hai sẽ làm-- Tôi không quan tâm đó là trường hợp – Graviton

Trả lời

17

Bạn có thể giải quyết vấn đề, bằng cách sử dụng một mảng cho phần tử đầu tiên ("2e") là tốt:

$arr = array(); 

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

print_r($arr); 
+0

+1 Điều này cũng sẽ mang đến cho bạn kết quả nhất quán. – soulmerge

0

Bạn cần viết chức năng thực hiện điều đó. Hoặc khởi tạo phần tử đầu tiên của bạn dưới dạng một mảng và sử dụng hàm array_push để thêm các phần tử mới.

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

Có ba tình huống:

  1. Điều quan trọng là không xác định
  2. Điều quan trọng là xác định, nhưng vẫn chưa được thiết lập để một mảng
  3. Điều quan trọng là xác định, và phần tử là một mảng.

Vì vậy, trong mã:

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

Đó là chỉ là trường hợp cuối cùng đó là khó khăn: nếu nó không phải là một mảng nào, bạn sẽ cần phải soạn một sử dụng giá trị hiện tại cộng với cái mới.

+0

+1 để làm rõ những gì từng khối. – Residuum

+0

Lưu ý rằng hàm này không trả về bất cứ điều gì vì vậy sẽ tốt hơn nếu trả về mảng này hoặc sử dụng '& $ array' trên danh sách tham số. – Volvox

0

Hãy thử điều này

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

thực hiện chính xác những gì bạn muốn.

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

Điều gì đó tương tự? Bạn chắc chắn có thể đơn giản hóa điều này bằng cách thêm giá trị đầu tiên làm mảng một phần tử hoặc bằng cách sử dụng toán tử ternar, tuy nhiên, bạn sẽ cần một hàm tùy chỉnh để thực hiện công việc.

0

nghiêm mảng:

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

String với dải phân cách:

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

nếu bạn cần chuỗi như là một mảng chỉ $arr['a'] = explode("/",$arr['a']);

cả hai phương pháp là xấu xí ... bạn nên thử , như FlorianH đã đề xuất, sử dụng toàn bộ biến làm mảng.

Một phương pháp khác có thể là sử dụng Giao diện trong PHp và xây dựng một cái gì đó làm cho việc sử dụng giao diện Iterator và ArrayAccess. (http://us3.php.net/manual/en/class.iterator.php, http://us3.php.net/manual/en/class.arrayaccess.php)

Các vấn đề liên quan