PHP: anahtar zaten varsa anahtarı eklemek değilse, değer ekleme

7 Cevap php

PHP bunu yapmanın kısa ve öz bir yol arıyorum:

Ben ona bir key=>value çiftini eklerseniz, bir dizi verilen, rutin anahtar zaten var olup olmadığını kontrol etmelisiniz.

Mevcut değil ise, key=>value çift diziye ekleyin.

Eğer, sonra değeri dizinin değeri eklemek gerekmektedir. Yani, örneğin, eğer ilk dizi şudur

arr['a']='2e'

Ben diziye bir 'a'=>'45' çifti eklediğinizde, daha sonra rutin bana dönecektir

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

Ben başka bir 'a=>gt' çifti eklediğinizde, daha sonra rutin bana dönecektir

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

Bunu yapmanın bir sözün yolu var mı? Tabii ki kendim yazabilirim ama benim çözüm çok çirkin olduğuna inanıyorum.

7 Cevap

Sen ilk elemanı için bir dizi ("2e") lutfen kullanarak, sorunu çözmek olabilir:

$arr = array();

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

print_r($arr);

Üç durum vardır:

  1. Anahtar tanımsız
  2. Anahtar tanımlanır, ancak henüz bir diziye ayarlı değil
  3. Anahtar tanımlanır ve bir dizi element olmasıdır.

Yani, kodu:

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

Sadece zor bulunuyor son durum: Henüz bir dizi değil ise, geçerli değerini artı yeni birini kullanarak bir tane oluşturmak gerekir.

Bunu yapan bir işlevi yazmak gerekir. Ya da yanı sıra bir dizi olarak ilk elemanı başlatmak ve yeni öğeler eklemek için array_push işlevini kullanın.

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

Bu deneyin

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

tam olarak ne istediğinizi yapar.

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

Böyle bir şey? Sen kesinlikle bir tek eleman dizi olarak veya ternar operatörleri kullanarak ilk değer ekleyerek bu kolaylaştırabilirsiniz, ama yine de sen işi yapmak için özel bir işlev gerekir.

Strictly dizi:

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

Ayırıcılar ile dize:

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

Eğer bir dizi olarak dize gerekiyorsa, sadece $arr['a'] = explode("/",$arr['a']); do

FlorianH önerdiği gibi her iki yöntem de çirkin ... bir dizi olarak tüm değişken kullanmak için, denemelisiniz.

Başka bir yöntem php Arayüzü kullanımı ve Iterator ve ArrayAccess arayüzleri suse yapmak bir şey inşa etmek için olabilir. (http://us3.php.net/manual/en/class.iterator.php, http://us3.php.net/manual/en/class.arrayaccess.php)