web-dev-qa-db-fra.com

rechercher et remplacer la valeur dans PHP array

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.

28
TMS

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
    )
);
25
Deept Raghav

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.

27
outis

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];
    }
}
6
BurninLeo

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é!

6
Prasad Rajapaksha

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);
3
user3396065

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.

2
Dan - See Green

$ar[array_search('green', $ar)] = 'value';

1
Douglas Comim

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

1
waltzofpearls
 <b>$green_key = array_search('green', $input); // returns the first key whose value is 'green'

$ input [$ green_key] = 'Apple'; // remplacer "vert" par "Apple"

0
Muthu Krishnan