de recherche et de remplacer la valeur dans le tableau PHP
J'ai été à la recherche pour certains standard fonction PHP pour remplacer une partie de la valeur d'un tableau avec d'autres, mais, étonnamment, je n'ai pas trouvé, donc je dois écrire mon propre:
function array_replace_value(&$ar, $value, $replacement)
{
if (($key = array_search($ar, $value)) !== FALSE) {
$ar[$key] = $replacement;
}
}
Mais je me demande encore - pour une chose facile, il doit être déjà une fonction pour que cela! Ou peut-être beaucoup plus simple que celui inventé par moi?
Notez que cette fonction ne fera qu'un seul remplacement. Je suis à la recherche de solutions existantes, de même que remplacer une occurrence unique, ainsi que celles qui remplace toutes les occurrences.
- Notez que les tableaux sont passés par valeur. Vous aurez besoin soit de retour le nouveau tableau à partir de la fonction (correspondant au comportement du reste de la
array_*
fonctions) ou fairearray_replace_value
prendre$ar
par référence. - str_replace() prend des tableaux, mais vous ne pouvez pas vous limiter à un seul remplacement.
- Merci @outis, j'ai réalisé moi-même au cours de débogage dans le temps 🙂
- lorsque vous remarque la fonction effectue un remplacement, vous signalant un défaut ou en notant le comportement souhaité?
- en fait, à la fois 🙂 Maintenant, il est souhaitée, mais pour un autre l'utilise peut devenir un défaut 🙂
str_replace
effectue également des sous-chaîne de remplacement, où Tomas fonction ne remplace les correspondances exactes.- selon ce que vous êtes en utilisant les tableaux de chaîne pour, peut-être plus logique (et plus efficace) à utiliser les chaînes de caractères comme des indices plutôt que de valeurs. Par exemple, les ensembles de chaînes sont mieux mises en œuvre de cette façon.
- non, parce que l'ordre des chaînes est important, il est naturel pour l'avoir comme valeurs, comme
array('apple', 'coconut', 'banana')
. - éléments de tableau de préserver l'ordre d'insertion, si c'est ce que vous parlez.
uksort
tour d'autres ordres à une insertion de la commande; arbitraire des ordonnancements peuvent être pris en charge par l'aide d'un tableau de string=>index (qui pourrait être le même que le tableau à trier), l'envers du tableau que vous avez actuellement, bien que la mise à jour de la commande tableau devient cher. - fonction array_replace_value(array $sujet, $recherche, $replace) { if (($key = array_search($objet, $recherche)) !== false) { $objet[$key] = $remplacer; } return $sujet; } Pas plus courte de la fonction ou quelque chose comme cela, mais la mise à jour de la fonction qui correspond à l'autre php array_* les fonctions et le paramètre de nommage aussi le str_replace par exemple. Mais vous fonction est très pratique pour moi et je ne pense pas qu'il existe un plus court chemin.
- peut-être vous apporter une réponse, le code en commentaire n'a pas l'air sympa 🙂
- Je sais, mais c'est pas vraiment de réponse, parce que c'est presque le même code que dans la question. Mais je peux si vous le souhaitez. 😉
Vous devez vous connecter pour publier un commentaire.
Alors qu'il n'y a pas une fonction équivalente à l'exemple de code, vous pouvez utiliser
array_keys
(avec l'option de recherche de la valeur de paramètre),array_fill
etarray_replace
pour obtenir la même chose:ÉDITION par Tomas: le code ne fonctionnait pas, corrigé:
array_replace()
supposer que vous savez déjà sur les touches? La COOP est à la recherche de la recherche et de la remplacer par la valeur.array_replace
remplace par la clé, pas de valeur.array_replace
.<br/>
n'est pas sémantique. En outre, vous n'avez pas besoin, pour.array_search
de trouver un seul élément à remplacer, et la première partie de cette réponse couvre déjàarray_replace
.Au lieu d'une fonction qui ne remplace les occurrences d'une valeur dans un tableau, il y a le plus général
array_map
:Pour remplacer les multiples occurrences de plusieurs valeurs à l'aide du tableau de la valeur => remplacement:
Pour remplacer une seule occurrence d'une valeur, vous pouvez utiliser
array_search
comme vous le faites. Parce que la mise en œuvre est si courte, il n'y a pas beaucoup de raisons pour les développeurs PHP pour créer une fonction standard pour effectuer la tâche. Pour ne pas dire que ça n'a pas de sens pour vous de créer une telle fonction, si vous vous trouvez avoir besoin souvent.array_*
fonction créera un tableau comme son résultat: ici, trois dans Raghav de l'. Comme toujours, le profilage est la meilleure façon de déterminer la performance.Essayer cette fonction.
Cheers!
Si la performance est un problème, on peut envisager de ne pas créer de multiples fonctions au sein de
array_map()
. Notez queisset()
est extrêmement rapide, et ces solutions ne fait pas appel à d'autres fonctions à tous.Ce sujet
array_walk()
avec rappel?Selon que c'est la valeur, la clé ou deux que vous souhaitez rechercher et remplacer sur vous pourriez faire quelque chose comme ceci:
Je ne dis pas que c'est le plus efficace ou élégant, mais simple et sympathique.
Basé sur
Deept Raghav
's réponse, j'ai créé le suivre solution qui répond à la recherche d'expressions régulières.PhpFiddle: http://phpfiddle.org/lite/code/un7u-j1pt
$input[$green_key] = 'pomme'; //remplacez "vert" avec la "pomme"
$ar[array_search('green', $ar)] = 'value';
array_search
renvoie false?