web-dev-qa-db-ja.com

PHP配列の値を検索して置換

私はいくつかの標準のPHP配列の値を他の値に置き換える関数を探していましたが、驚いたことに何も見つけられなかったので、自分で書かなければなりません:

function array_replace_value(&$ar, $value, $replacement)
{
    if (($key = array_search($ar, $value)) !== FALSE) {
        $ar[$key] = $replacement;
    }
}

しかし、私はまだ疑問に思っています-そのような簡単なことのために、すでに何らかの機能がなければなりません!それとも私が発明したこのソリューションよりもはるかに簡単なソリューションでしょうか?

この関数は1回だけ置換を行うことに注意してください。同様に、単一のオカレンスを置き換える既存のソリューションと、すべてのオカレンスを置き換える既存のソリューションを探しています。

28
TMS

サンプルコードに相当する関数はありませんが、 array_keys (オプションの検索値パラメーターを使用)、 array_fill および array_replace 同じことを達成するには:

Tomasによる編集:コードが機能していなかったため、修正しました:

$ar = array_replace($ar,
    array_fill_keys(
        array_keys($ar, $value),
        $replacement
    )
);
25
Deept Raghav

配列内の1つの値の出現のみを置換する関数の代わりに、より一般的なarray_mapがあります。

array_map(function ($v) use ($value, $replacement) {
    return $v == $value ? $replacement : $v;
}, $arr);

Value => replacementの配列を使用して、複数の値の複数の出現を置換するには:

array_map(function ($v) use ($replacement) {
    return isset($replacement[$v]) ? $replacement[$v] : $v;
}, $arr);

1つの値の単一の出現を置き換えるには、array_searchを使用します。実装が非常に短いため、タスクを実行するための標準関数をPHP開発者が作成する理由はあまりありません。頻繁に必要な場合は、このような機能を使用してください。

27
outis

パフォーマンスが問題になる場合は、array_map()内に複数の関数を作成しないことを検討してください。 isset()は非常に高速であり、このソリューションは他の関数をまったく呼び出さないことに注意してください。

$replacements = array(
    'search1' => 'replace1',
    'search2' => 'replace2',
    'search3' => 'replace3'
);
foreach ($a as $key => $value) {
    if (isset($replacements[$value])) {
        $a[$key] = $replacements[$value];
    }
}
6
BurninLeo

この機能を試してください。

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

乾杯!

6

コールバック付きのarray_walk()はどうですか?

$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

それが値であるか、キーであるか、または両方で検索して置換するかによって、次のようなことができます。

$array = json_decode( str_replace( $replace, $with, json_encode( $array ) ), true );

これが最も効率的でエレガントだとは言いませんが、素晴らしくシンプルです。

2
Dan - See Green

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

1
Douglas Comim

に基づく Deept Raghavの答え、私は正規表現検索を行う次のソリューションを作成しました。

$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'; //「green」を「Apple」に置き換えます

0
Muthu Krishnan