2009-11-30 4 views
4

En Perl, je pourrais attribuer une liste à plusieurs valeurs dans un hachage, comme ceci:affectation à une tranche de tableau associatif en php

# define the hash... 
my %hash = (
    foo => 1, 
    bar => 2, 
    baz => 3, 
); 

# change foo, bar, and baz to 4, 5, and 6 respectively 
@hash{ 'foo', 'bar', 'baz' } = (4, 5, 6); 

Est-il possible de faire la même chose en php? En fait, y a-t-il même un moyen d'obtenir une tranche d'un tableau d'assoc?

+0

Note: Je connaissais déjà la liste et le but de la question était de trouver une solution plus élégante que la suivante: list ($ array ['a'], $ array ['b'], $ array [' c '], $ tableau [' d '], $ tableau [' e '], $ tableau [' f '], $ tableau [' g '], $ tableau [' h '], $ tableau [' i ' ], $ tableau ['j'], $ tableau ['k'], $ tableau ['l'], $ tableau ['m']) = some_function(); – spudly

Répondre

0

Il n'y a pas d'équivalent à la syntaxe Perl. Mais vous pouvez faire un tableau des clés d'intérêt et l'utiliser pour changer seulement une partie de votre tableau.

$koi=array('foo', 'bar', 'baz'); 
foreach($koi as $k){ 
    $myarr[$k]++; //or whatever 
} 

ou

array_walk($myarr, create_function('&$v,$k','$v=(in_array($k,$koi))? $v*2 : $v;')); //you'd have to define $koi inside the function 
1

Définir le hachage:

$hash = array(
    'foo' => 1, 
    'bar' => 2, 
    'baz' => 3, 
); 

# change foo, bar, and baz to 4, 5, and 6 respectively 
list($hash['foo'], $hash['bar'], $hash['baz']) = array(4, 5, 6); 

# or change one by one 
$hash['foo'] = 1; 
$hash['bar'] = 2; 
$hash['baz'] = 3; 

Voir la liste() fonction dans le manuel:

http://php.net/manual/en/function.list.php

+0

list() est vraiment dans la direction opposée: il prend une liste de variables et un tableau et assigne chaque élément du tableau à la variable correspondante (ie c'est un moyen de sortir les choses d'un tableau plutôt que de mettre les choses DANS). –

+0

Vous pourriez faire quelque chose comme $ info = array (4,5,6); list ($ a ['foo'], $ a ['bar'], $ a ['baz']) = $ info; mais en utilisant "liste" il n'y a vraiment pas de vous acheter quelque chose. –

+0

cette méthode fonctionne, mais c'est exactement ce que j'essayais d'éviter. Je ne veux pas taper le nom du tableau assoc pour chaque clé unique. quelque chose comme "assoc_array_slice ($ array, 'foo', 'bar', 'baz') = array (4, 5, 6)" est ce que je cherche vraiment. – spudly

0

En bref, non. Cependant, vous pouvez utiliser une fonction comme ceci:

function assignSlice($ar,$keys,$args) { 
    if (count($keys) !== count($args)) { 
    // may want to handle more gracefully; 
    // simply returns original if numbers of keys and values 
    // don't match 
    return $ar; 
    }             
    foreach ($keys as $index=>$key) { 
    $ar[$key] = $args[$index]; 
    } 
    return $ar; 
} 

$test = array(
    'foo'=>1, 
    'bar'=>2, 
    'baz'=>3, 
    ); 

$newtest = assignSlice($test,array('foo','bar'),array(4,5)); 

Edit: Code ajusté dans le commentaire de l'OP de réponse en question.

3

Une simple ligne unique (certaines de ces méthodes nécessitent des versions plus récentes de PHP que celles disponibles au moment de la demande):

$hash = array(
    'foo'=>1, 
    'bar'=>2, 
    'baz'=>3, 
); 

$hash = array_merge($hash, array('foo' => 4, 'bar' => 4, 'baz' => 5)); 

Saisie manuelle PHP pour array_merge.

Si vous cherchez à obtenir un ensemble de touches de tableau spécifiques, vous pouvez utiliser ceci:

$subset = array_intersect_key($hash, array_fill_keys(array('foo', 'baz'), '')); 

entrées Manuel PHP pour array_intersect_key et array_fill_keys.

Questions connexes