Je cherchais une fonction standard PHP pour remplacer une valeur d'un tableau par une autre, mais étonnamment, je n'en ai pas trouvé, donc je dois écrire la mienne:
function array_replace_value(&$ar, $value, $replacement)
{
if (($key = array_search($ar, $value)) !== FALSE) {
$ar[$key] = $replacement;
}
}
Mais je me demande toujours - pour une chose aussi simple, il doit déjà y avoir une fonction! Ou peut-être une solution beaucoup plus facile que celle que j'ai inventée?
Notez que cette fonction ne fera qu'un seul remplacement. Je recherche des solutions existantes qui remplacent de la même manière une seule occurrence, ainsi que celles qui remplacent toutes les occurrences.
Bien qu'il n'y ait pas une fonction équivalente à l'exemple de code, vous pouvez utiliser array_keys
(avec le paramètre de valeur de recherche facultatif), array_fill
et array_replace
pour réaliser la même chose:
EDIT par Tomas : le code ne fonctionnait pas, corrigé:
$ar = array_replace($ar,
array_fill_keys(
array_keys($ar, $value),
$replacement
)
);
Au lieu d'une fonction qui ne remplace que les occurrences d'une valeur dans un tableau, il y a le plus général array_map
:
array_map(function ($v) use ($value, $replacement) {
return $v == $value ? $replacement : $v;
}, $arr);
Pour remplacer plusieurs occurrences de plusieurs valeurs à l'aide d'un tableau de valeurs => remplacement:
array_map(function ($v) use ($replacement) {
return isset($replacement[$v]) ? $replacement[$v] : $v;
}, $arr);
Pour remplacer une seule occurrence d'une valeur, vous utiliseriez array_search
comme tu fais. Parce que l'implémentation est si courte, il n'y a pas beaucoup de raison pour que les développeurs PHP créent une fonction standard pour effectuer la tâche. Pour ne pas dire que cela n'a pas de sens pour vous de créer une telle fonction, si vous en avez souvent besoin.
Si les performances sont un problème, on peut envisager de ne pas créer plusieurs fonctions dans array_map()
. Notez que isset()
est extrêmement rapide, et cette solution n'appelle aucune autre fonction du tout.
$replacements = array(
'search1' => 'replace1',
'search2' => 'replace2',
'search3' => 'replace3'
);
foreach ($a as $key => $value) {
if (isset($replacements[$value])) {
$a[$key] = $replacements[$value];
}
}
Essayez cette fonction.
public function recursive_array_replace ($find, $replace, $array) {
if (!is_array($array)) {
return str_replace($find, $replace, $array);
}
$newArray = [];
foreach ($array as $key => $value) {
$newArray[$key] = recursive_array_replace($find, $replace, $value);
}
return $newArray;
}
À votre santé!
Qu'en est-il de array_walk()
avec rappel?
$array = ['*pasta', 'cola', 'pizza'];
$search = '*';
$replace = '\*';
array_walk($array,
function (&$v) use ($search, $replace){
$v = str_replace($search, $replace, $v);
}
);
print_r($array);
Selon que c'est la valeur, la clé ou les deux que vous souhaitez rechercher et remplacer, vous pouvez faire quelque chose comme ceci:
$array = json_decode( str_replace( $replace, $with, json_encode( $array ) ), true );
Je ne dis pas que c'est le plus efficace ou le plus élégant, mais agréable et simple.
$ar[array_search('green', $ar)] = 'value';
Basé sur Deept Raghav
réponse, j'ai créé la solution suivante qui fait la recherche d'expression régulière.
$arr = [
'Array Element 1',
'Array Element 2',
'Replace Me',
'Array Element 4',
];
$arr = array_replace(
$arr,
array_fill_keys(
array_keys(
preg_grep('/^Replace/', $arr)
),
'Array Element 3'
)
);
echo '<pre>', var_export($arr), '</pre>';
PhpFiddle: http://phpfiddle.org/lite/code/un7u-j1pt
<b>$green_key = array_search('green', $input); // returns the first key whose value is 'green'
$ input [$ green_key] = 'Apple'; // remplacer "vert" par "Apple"