2016-07-17 5 views
1

Ich habe eine einfache Zeichenfolge: $StrOne = "There is my text.";. Und, ich habe 2 einfache Arrays, auch:Wie ersetzt man in PHP eine Zeichenfolge durch Daten von 2 Arrays?

$ArrOne = array (

"1" => "a", 
"7" => "e", 
"5" => "c", 
"4" => "x", 
"2" => "r" 

); 

-

$ArrTwo = array (

"7" => "k", 
"9" => "z", 
"1" => "y", 
"3" => "x", 
"2" => "b" 

); 

I $StrOne mit Werten aus $ArrOne, durch Werte von $ArrTwo ersetzen möchten. Es ist meine Idee:

  • Schritt 1. Wenn es eine Gruppe von Buchstaben in $StrOne (was in $ArrOne bestanden ist), Suche in $ArrTwo welchem ​​Wert ist angebracht, die der gleiche Schlüssel (was in $ArrOne bestanden wird).
  • Schritt 2. Ersetzen Sie alle vorhandenen Werte (von Schritt 1.), mit dieser Funktion: strtr();.
  • Schritt 3. Zeigen Sie eine neue Ausgabezeichenfolge an (die vollständig ersetzt wird, von Schritt 2.).

Die Ausgabezeichenfolge lautet: $StrTwo = "Thkrk is my tkxt.";.


Wie erstellt man eine einfache PHP-Funktion, die es so macht?

+0

wie etwa http://php.net/manual/ru/function.str-replace.php? –

+0

Zeigen Sie uns Ihren Versuch, das Problem zu lösen. – BeetleJuice

+0

@BeetleJuice, ich habe versucht, mein Problem zu lösen, indem Sie diese Funktion verwenden: '$ length = count ($ arrayOne); für ($ i = 0; $ i <$ länge; $ i ++) { $ ersatz [$ arrayOne [$ i]] = $ arrayTwo [$ i]; } echo strtr ($ string, $ ersetzung); '. Aber es funktioniert nur mit einem eindimensionalen Array. – 16ctt1x

Antwort

1

Zuerst müssen wir array_intersect_key verwenden, um Schlüssel zu finden, die in beiden Arrays vorhanden sind.

Zweitens sortieren wir geschnittene Arrays, so dass ihre Schlüssel in der gleichen Reihenfolge mit waren.

Drittens verwenden wir array_combine, um zweiten Parameter für strtr Funktion zu erstellen.

Forth wir verwenden strtr:

$arrayOne = array (
    "1" => "a", 
    "7" => "e", 
    "5" => "c", 
    "4" => "x", 
    "2" => "r" 
); 

$arrayTwo = array (
    "7" => "k", 
    "9" => "z", 
    "1" => "y", 
    "3" => "x", 
    "2" => "b" 
); 

$keys = array_intersect_key($arrayOne, $arrayTwo); 
ksort($keys); 
$values = array_intersect_key($arrayTwo, $arrayOne); 
ksort($values); 

echo strtr('There is my text.', array_combine($keys, $values)); 

-Update: für ältere Versionen:

$replace = array(); 
foreach ($arrayOne as $k => $v) { 
    // use isset if you want to replace something with empty string 
    if (!empty($arrayTwo[$k])) {  
     $replace[$v] = $arrayTwo[$k]; 
    } 
} 

echo strtr('There is my text.', $replace); 
+0

Es tut mir leid, ich möchte diese Funktionen nicht verwenden: [array_intersect_key] (http://php.net/manual/en/function.array-intersect-key.php) und [array_combine] (http: // php .net/manual/de/function.array-combine.php); weil mein Server zu * out of update * ist. – 16ctt1x

+0

Dein PHP ist nicht php5? –

+0

Ja, mein Server läuft noch * PHP 4 *. Würde es Ihnen etwas ausmachen, einem anderen eine andere Antwort zu geben? – 16ctt1x

0

Sie haben erwähnt, dass Sie nicht array_intersect verwenden können. Dies ist, wie ich es tun würde:

//remove anything from $arrayOne that doesn't have a replacement 
// in $arrayTwo 
$arrayOne = array_filter(
    $arrayOne, 
    function($k) use($arrayTwo){return isset($arrayTwo[$k]);}, 
    ARRAY_FILTER_USE_KEY); 

//remove anything from $arrayTwo that doesn't have a match 
//in $arraaOne 
$arrayTwo = array_filter(
    $arrayTwo, 
    function($k) use($arrayOne){return isset($arrayOne[$k]);}, 
    ARRAY_FILTER_USE_KEY); 

//sort the keys so that matching keys will be in same position 
ksort($arrayOne); ksort($arrayTwo); 

//Now arrays have the same keys in the same position. 
//It's safe to perform the replacement 
$stringOut = str_replace($arrayOne,$arrayTwo,$stringInp); 

Live demo

+0

Mein Code hat keine 26 Zeilen. Außerdem habe ich vor dem Posten überprüft. Ich habe dir sogar einen Link zu einer Live-Demo gegeben, damit du sehen kannst, wie es für dich funktioniert. – BeetleJuice

+0

In dieser Zeile: 'function ($ k) use ($ arrayTwo) {return isset ($ arrayTwo [$ k]);}'. – 16ctt1x

+0

'use' benötigt Version 5.3 – trincot

Verwandte Themen