2009-08-28 8 views
8

Busco una manera sucinta de hacer esto en PHP:PHP: anexar a valorar si la clave ya existe, si no añadir la clave

dada una matriz, si añado una key=>value par a él, el la rutina debe verificar si la clave ya existe.

Si no existe, agregue a la matriz con el key=>value par.

Si lo hace, entonces el valor debe agregarse al valor de la matriz. Así, por ejemplo, si la matriz inicial es este

arr['a']='2e' 

Cuando agrego un par 'a'=>'45' a la matriz, a continuación, la rutina me va a volver

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

Cuando agrego otra 'a=>gt' par a ella, entonces la rutina me devolverá

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

¿Hay una manera sucinta de hacer esto? Por supuesto que puedo escribirlo yo mismo, pero creo que mi solución es muy fea.

+0

Debe aclarar algo, ¿realmente quiere arr ['a'] = '2e' al principio, o es un error tipográfico y espera arr ['a'] = array ('2e ')? –

+0

Ambos harían-- No me importa cuál es el caso – Graviton

Respuesta

17

Se podría resolver el problema, utilizando una matriz para el primer elemento ("2e") aswell:

$arr = array(); 

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

print_r($arr); 
+0

+1 Esto le daría un resultado consistente, también. – soulmerge

0

Necesita escribir una función que lo haga. O inicialice su primer elemento como una matriz y use la función array_push para agregar nuevos elementos.

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

Hay tres situaciones:

  1. La clave no está definido
  2. se define la llave, pero aún no está establecida en una matriz
  3. se define la clave, y el elemento es una matriz.

Así, en código:

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

Es sólo el último caso que es complicado: si todavía no es una matriz, que necesita para componer uno usando el valor actual más el nuevo.

+0

+1 para aclarar lo que hace cada bloque. – Residuum

+0

Tenga en cuenta que esta función no devuelve nada, por lo que sería bueno devolver esta matriz o usar '& $ array' en la lista de parámetros. – Volvox

0

probar este

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

hace exactamente lo que quiere.

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

Algo así? Seguramente puede simplificar esto agregando el primer valor como una matriz de un elemento, o mediante el uso de operadores ternar, pero de todos modos necesitará una función personalizada para hacer el trabajo.

0

Estrictamente matriz:

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

cadena con separadores:

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

si necesita la cadena como una matriz Eso sí, $arr['a'] = explode("/",$arr['a']);

ambos métodos son feos ... usted debe tratar , como sugirió Florian, usar toda la variable como una matriz.

Otro método podría ser utilizar la interfaz en PHp y construir algo que haga suste de las interfaces Iterator y ArrayAccess. (http://us3.php.net/manual/en/class.iterator.php, http://us3.php.net/manual/en/class.arrayaccess.php)

Cuestiones relacionadas