PHP меняет числа на строки с str_replace без перепутать - PullRequest
0 голосов
/ 06 октября 2018

Я меняю числа на строки.Вот так:

1=>A
2=>B
3=>C
4=>D
5=>E
6=>F
7=>G
8=>H
9=>I
10=>J
11=>K
12=>L

Я сделал эту функцию для замены:

function name($string) {
    $find=array("1","2","3","4","5","6","7","8","9","10","11","12");
    $replace=array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L");
    $string=str_replace($find,$replace,$string);  
    return $string;
}

Но если я использую это: name("12"); он не возвращает L его возврат AB.

На самом деле это имеет смысл.Возвращаю каждое письмо.Как я могу вернуть L в этой функции?Что я должен делать?Заранее спасибо.

Ответы [ 6 ]

0 голосов
/ 06 октября 2018

вместо str_replace используйте chr

function name($string) {
    return chr( $string + 64 );
}

обратите внимание, что это будет слово до тех пор, пока $string фактически содержит число в диапазоне1 .. 26


Но если - по какой-то причине - вы хотите придерживаться подхода str_replace, решение состоит в том, чтобы дополнить числа начальным и следующим пробелом (или символом по вашему выбору)...), таким образом:

function name($string) {
    $string = " " . $string . " ";
    $find=array(" 1 "," 2 "," 3 "," 4 "," 5 "," 6 "," 7 "," 8 "," 9 "," 10 "," 11 "," 12 ");
    $replace=array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L");
    $string=str_replace($find,$replace,$string);  
    return $string;
}
0 голосов
/ 06 октября 2018

str_replace() с массивом заменяет предоставленную строку любым совпадением в элементах массива.Поэтому используйте array_search(), как показано внизу

$result = $replace[array_search($string, $find)]; 

Таким образом, ваш код изменился на

function name($string) {
    $find = array("1","2","3","4","5","6","7","8","9","10","11","12");
    $replace = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L");  
    return $replace[array_search($string, $find)]; 
}

Проверьте результат в demo

0 голосов
/ 06 октября 2018

Если я не понял вашего вопроса, тогда , попробуйте с range() вместо длинного key => value array.Я думаю, что для вашего текущего требования str_repalce() не является хорошим выбором, просто range() сделает волшебство:)

<?php
  function name($num){
    $array = range('A','Z');
    $array = array_filter(array_merge(array(0), $array));
    return $array[$num];
  }

 echo name(12);

DEMO: https://3v4l.org/kl9jn

0 голосов
/ 06 октября 2018

У вас есть функция PHP для того, чего вы пытаетесь достичь - chr

<?php 

function name($string) {
   return chr(intval($string) + 64);
}

ОБНОВЛЕНИЕ:

  • Спасибо @Ulrich.Вы можете лучше описать вышеупомянутое решение, используя ord('A').Итак, в основном вы добавляете значение ASCII A к целочисленному преобразованному строковому параметру и вычитаете из него 1, чтобы получить значение ASCII для искомого символа.chr() наконец дает нам этот символ.

function name($string) {
   return chr(intval($string) + ord('A') - 1);
}
0 голосов
/ 06 октября 2018

Создание простого сопоставления:

$mapping = [
    '1' => 'A',
    '2' => 'B',
    '12' => 'L',
];
if (!array_key_exists($string, $mapping)) {
    throw new Exception('invalid input provided');
}
return $mapping[$string];
0 голосов
/ 06 октября 2018

Проблема в том, что str_replace() просто заменяет их в порядке, указанном вами в документации ...

Порядок замены получен

Поскольку str_replace () заменяет слева направо, он может заменить ранее вставленное значение при выполнении нескольких замен.См. Также примеры в этом документе.

Если вместо этого вы используете strtr(), он заменит их сначала дольше всего ...

$string=strtr($string, array_combine($find, $replace));
...