2011-12-09 13 views
3

str_replace()に関してちょっと気付いたことがあります。 私の関数では、結果をソートする際のわずかな変更と同じ2つのmysqlクエリを作成する必要があります。引数として、注文句を含む文字列を取得します。たとえば '姓ASC'ですが、 '姓DESC'でもかまいません。今、私は簡単にstr_replaceを使用して逆ソートに切り替えることを望んでいたと私は、これはトリックを行う必要が考えた:私の心の中でstr_replaceと配列でテキストを切り替える

str_replace(array('ASC', 'DESC'), array('DESC', 'ASC'), $subject) 

それはASCとDESCとDESCのすべての出現箇所でASCのすべての出現箇所を変更する必要があります。文字列には2つのうちの1つのみが含まれているため、逆順の句を取得する必要があります。 しかし、これは当てはまりません。上記のコードの出力は同じ文字列です。

私はいくつかのテストを行なったし、それがこれらの呼び出しは、あなたがそれらをやりたいことをtourned:

str_replace('ASC', 'DESC', $subject) 
str_replace(array('ASC'), array('DESC'), $subject) 

私の意見では

array('ASC', 'DESC') != array('DESC', 'ASC') 

はなぜ、PHPはこれを検討するため、これは奇妙です等しい?このような交換を簡単に行うための他の方法はありますか?

答えて

4

、あなたはそうのようなstrtrを使用することができます。

strtr($subject, array('ASC' => 'DESC', 'DESC' => 'ASC')); 

2つの引数が与えられ、第二の形式 array('from' => 'to', ...)で配列する必要がある場合はこれが

ために動作します。戻り値は、配列キーのすべての が対応する の値に置き換えられた文字列です。最も長いキーが最初に試されます。部分文字列に が置換されると、その新しい値は再び検索されません。

See it in action。あなたがすでに判明しているとして、何が起こるかstr_replace、と

は最初ASCDESCに置き換えられ、その後DESCが行わ何の総計のために、バックASCに置き換えられていることです。

0

私は実際に推測します:置換は連続しています。これは、最初にASCDESCに置き換え、次にDESCASCに置き換えたもので、同じ文字列に再びなります。

更新:それはそう、私が正しい

php > $a = 'I am a string'; 
php > var_dump(str_replace(array('am', 'is'), array('is', 'k'), $a)); 
string(12) "I k a string" 

まずそれがk

3
isで(最初のエントリ) amを交換し、その後 is

PHPが変化する、最初の最初のパラメータを "レンダリング"すべての出現があなたの望むように(すべてASCDESCに設定されています)。

しかし、その後、あなたは基本的にあなたの最初のパラメータをゼロにするので、すべてのDESC sはASCに設定され、反対のことを行うことを言って二番目のパラメータを渡します。このシナリオでは

関連する問題