Как можно заменить каждую букву строки на (рандомную) цифру в php

Допустим у нас есть $x = 'Hello world'. У меня появился вопрос, как можно заменить каждую букву в $x на рандомную цифру от 1 до 100? У меня есть некоторые предположения, которые, почему то, не работают например я пробовал:

$x = 'Hello world'; // задаем строку
for($i = 0;$i<strlen($x);$i++){ //цикл, который, по идее, бегает от начала строки до конца строки
    echo str_replace($x[$i], rand(1,100),$x); //вывод замены буквы по индексу на рандомуню цифру с помощью str_replace()
}

так же, пробовал с помощью str_split():

<?php
$x = 'Hello world';
$arr = str_split($x);
for($i=0;$i<=count($arr);$i++){
    echo str_replace($arr[$i], rand(1,100),$arr);
}

но при этом, почему то, появляется много массивов, при выводе которых видно, что буквы в предложении заменены архаично. Так же, в идеале, хотел бы понять, как можно заменить каждую букву в предложении на ее порядковый номер в алфавите(a = 1, b = 2,c = 3 и т.д) Спасибо


Ответы (2 шт):

Автор решения: UModeL

Решения "в лоб" (предполагается использование только латиницы):

  • Замена каждой буквы на случайное число в диапазоне от 1 до 100:
<?php
$sTxt = 'Hello world';
$sRes = preg_replace_callback(
    '/\w/',  
    function ($matches) {
        return rand(1, 100) . ' '; // Пробел только для примера
    },
    $sTxt
);
echo $sRes;
  • Замена каждой буквы на её порядковый номер в алфавите:
<?php
$sTxt = 'Hello world';
$sRes = preg_replace_callback(
    '/\w/',  
    function ($matches) {
        return ord(strtoupper($matches[0])) - 64 . ' '; // Пробел только для примера
    },
    $sTxt
);
echo $sRes;
→ Ссылка
Автор решения: Сергей Махнёв

Зацеплюсь за эту часть задачи: "в идеале, хотел бы понять, как можно заменить каждую букву в предложении на ее порядковый номер в алфавите(a = 1, b = 2,c = 3 и т.д) ".

$in_glass = "Hello world";
$array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
for ($i = 0; $i < mb_strlen($in_glass); $i++) {
    $char = mb_strtolower(mb_substr($in_glass, $i, 1));
    $k = 1;
    foreach ($array as $val) {
        if ($char == $val) {
            $char = $k;
            break;
        }
        $k++;
    }
    $result .= $char;
}
print $result;

Ответ: 85121215 231518124

Этот же пример с array_flip()

$in_glass = "Hello world";
$array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
$array_new = array_flip($array);
    for ($i = 0; $i < mb_strlen($in_glass); $i++) {
        $char = mb_strtolower(mb_substr($in_glass, $i, 1));
        foreach ($array_new as $val => $value) {
            if ($char == $val) {
                $char = $value+1;
                break;
            }
        }
        $result .= $char;
    }
   print $result;

Ответ:85121215 231518124

На сколько я знаю, нельзя просто пробежать по слову циклом, нужно брать функции, которые вытаскивают букву посимвольно, например mb_substr Если расматривать изначальную задачу: "как можно заменить каждую букву в $x на рандомную цифру от 1 до 100?", то вот так:

$in_glass = "Hello world";
$array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
    for ($i = 0; $i < mb_strlen($in_glass); $i++) {
        $char = mb_strtolower(mb_substr($in_glass, $i, 1));
        foreach ($array as $val) {
            if ($char == $val) {
                $char = rand(0,100);
                break;
            }
        }
        $result .= $char;
    }
   print $result;

Ответ: 7681812846639 69262692966374

При данном методе не надо учитывать пробелы, знаки препинания и спец символы.

→ Ссылка