генериране на стринг при дадено условие от друг стринг

vasilev

Registered
здравейте,
имаме даден стринг:
xboss4501ddrt01

записвам условие:
if 0-2 element = xbo - return X
if 3 element = s - return D
if 4-6 el.. = 4501. - return 22
if last 2 el = 01 .. return 1

тоест имаме някакъв стринг с X символа и трябва по дадена логика да генерира друг стринг. в условието казваме и колко дълъг е стринга.. примерно 10 символа.

има ли бърз начин това да стане ?

мерси !
 
Най-лесният вариант, е като знаеш позициите и са постоянна величина. Тогава ползваш substr() и си ти.


PHP:
<?php
$string = 'xboss4501ddrt01';
$newString = '';
$newString .= substr($string, 0, 3) == 'xbo' ? 'X' : '';
$newString .= substr($string, 3, 1) == 's' ? 'D' : '';
$newString .= substr($string, 5, 4) == '4501' ? '22' : '';
$newString .= substr($string, 13, 2) == '01' ? '1' : '';

echo $newString;
 
здравей. мерси !
.. да забравих да напиша че тези rules ще се записват в базата в едно единствено поле - в какъв вид ще е - varchar , още не съм измислил структурата но идеята е - четеш тази стойност, подаваш стринга - input и по нея правиш variable - output.
 
здравей. мерси !
.. да забравих да напиша че тези rules ще се записват в базата в едно единствено поле - в какъв вид ще е - varchar , още не съм измислил структурата но идеята е - четеш тази стойност, подаваш стринга - input и по нея правиш variable - output.
Не ти схванах идеята. Какво ще записваш в базата и как ще го изваждаш?

Нещо свързано с VIN номера ли ще правиш?
 
не, това е за мапинг на име на приложение ако имаме името на сървъра на което приложението се намира.
е това:

PHP:
(substr($string, 0, 3) == 'xbo' ? 'X' : '').(substr($string, 3,1) == '2' ? '0' : '')...

защото ще има различни рулове...
да и това ще е друг въпрос как да го запиша така че след като го изведа да получа функция а не просто текст :)
 
Последно редактирано:
Дай няколко примера с постъпили стрингове, кое на какво отговаря по стринга и какво трябва да се получи на изхода. Може да се налага да се ползва regex или нещо различно.

PHP:
<?php
function XD221()
{
    return __FUNCTION__;
}


$string = 'xboss4501ddrt01';
$applicationName = '';
$applicationName .= substr($string, 0, 3) == 'xbo' ? 'X' : '';
$applicationName .= substr($string, 3, 1) == 's' ? 'D' : '';
$applicationName .= substr($string, 5, 4) == '4501' ? '22' : '';
$applicationName .= substr($string, 13, 2) == '01' ? '1' : '';

echo $applicationName();
 
подаваш xb1289sdkjas83 - някакъв стринг, четеш от базата и взимаш това поле -

$rule=$zobj["rule"];
$result=$rule('xb1289sdkjas83');

като това трябва да ти върне каквото си задал .. примерно XV01
и казваш -

ако substr(str,0,3)==xb1?X:"";.. до края. ако има матч на руловете от това поле което си задал - правиш изхода.
как кой стринг да вземеш - сам определяш. важното е след това да го прочета това от базата и да го използвам.
начина по който ще се запише в базата - пак е въпрос на избор, това се опитвам да разбера - как :) тоест свобода има.
 
подаваш xb1289sdkjas83 - някакъв стринг, четеш от базата и взимаш това поле -

$rule=$zobj["rule"];
$result=$rule('xb1289sdkjas83');

като това трябва да ти върне каквото си задал .. примерно XV01
и казваш -

ако substr(str,0,3)==xb1?X:"";.. до края. ако има матч на руловете от това поле което си задал - правиш изхода.
как кой стринг да вземеш - сам определяш. важното е след това да го прочета това от базата и да го използвам.
начина по който ще се запише в базата - пак е въпрос на избор, това се опитвам да разбера - как :) тоест свобода има.
Колега, нещо не можеш да ни го обясниш коректно, просто защото сам не можеш да си го представиш.
Дай няколко примерни низа:
xb1289sdkjas83
xb0289sdkjas85
xb2289sdkjas95

Дай правилото, по което да се мачва и на какво да отговаря:
xbo s s 4501 ddrt 01
Х D 22 1
Ако може да се изчислява няма необходимост да пазиш излишно инфо по алгоритъма за валидиране в базата с данни.
 
нали това обясних :)
правилото ти го измисляш и запазваш в поле в базата. има си uid .. и по това uid се прочита полето. след това - мачваш стринга по логиката която е записана в полето.

1666355569746.png
 
Във функцията можеш да си сложиш всякаква логика за темплейта. Може да си направиш групировка от позиции. Това е просто пример на базово ниво.

PHP:
<?php
function transform(string $server, array $template = []): string
{
    $string = '';
    $chars = mb_str_split($server);
    foreach ($chars as $position => $char) {
        if (!isset($template[$position])) {
            continue;
        }
        $rules = $template[$position];
        $search = $rules['search'] ?? '';
        $replace = $rules['replace'] ?? '';
        if ($char == $search) {
            $string .= $replace;
        }
    }
    return $string;
}

echo transform(
    'server',
    [
        0 => ['search' => 's', "replace" => 'Y'],
        2 => ['search' => 'r', "replace" => 'e'],
        4 => ['search' => 'e', "replace" => 's'],
    ]
);
 
хм, но ако имам две позици ? ще трябва всяка поотделно да описвам нали така.
със substr не е ли по лесно да опишеш позициите и дъжината - примерно от 0-2 -> 0,3 ?

тъй като накрая - SRE -> D примерно тоест да вземеш три позиции и да изведеш само една спрямо тези три.
 
хм, но ако имам две позици ? ще трябва всяка поотделно да описвам нали така.
със substr не е ли по лесно да опишеш позициите и дъжината - примерно от 0-2 -> 0,3 ?
Нали искаш да е динамично. До колкото те разбрах първичният низ може да е с различна дължина. Тоест това те ограничава да използваш substr освен ако не си направиш някаква извратена логика в базата с данни. При метода с темплейта, на практика можеш в базата да запомняш json темплейти, да ги вадиш и да ги обърнеш с json_decode($database->json, true); към асоциативен масив и да въртиш в трансформъра логиката. Ако си направиш различни ключове в масива и примерно групи от позиции, то реално лесно можеш да изплюваш някакъв отговор според темплейта. В момента съм дал най-простото заменяне за всяка от позициите на низа. Варианти бол с този начин на работа.
Не, че със substr няма да стане също, ако го направиш примерно динамично.
 
Ето ти и пълен пример със substr.


PHP:
<?php
function transform(string $server, array $template = []): string
{
    $string = '';
    foreach($template as $rule) {
        $substr = $rule['substr'] ?? [];
        if (($countSubstr = count($substr)) <= 0) {
            continue;
        }
        $result = '';
        $search = $rule['search'] ?? '';
        $replace = $rule['replace'] ?? '';
        $offset = $substr[0];
        if ($countSubstr == 1) {
            $result = substr($server, $offset);
        } else {
            $length = $substr[1];
            $result = substr($server, $offset, $length);
        }
        if ($result == $search) {
            $string .= $replace;
        }

    }
    return $string;
}

function XD221()
{
    return __FUNCTION__;
}

$function = transform(
    'xboss4501ddrt01',
    [
        [
            'substr' => [0 , 3],
            'search' => 'xbo',
            'replace' => 'X',
        ],
        [
            'substr' => [3 , 1],
            'search' => 's',
            'replace' => 'D',
        ],
        [
            'substr' => [5 , 4],
            'search' => '4501',
            'replace' => '22',
        ],
        [
            'substr' => [13 , 2],
            'search' => '01',
            'replace' => '1',
        ],
    ],
);
if (function_exists($function)) {
    echo $function();
} else {
    echo $function . ' not exists.';
}
 
Евала за търпението @dakata__92
Често ми се случва и на мен да ми е каша в главата. Този форум много ми е помогнал, затова се опитвам и аз да помагам, когато мога. Както се казва му дадох кода на готово, но и на мен са ми давали, а и не е ракетна наука.
 
Често ми се случва и на мен да ми е каша в главата. Този форум много ми е помогнал, затова се опитвам и аз да помагам, когато мога. Както се казва му дадох кода на готово, но и на мен са ми давали, а и не е ракетна наука.
Евалата и от мен. Каквото можем, и включително и аз, бихме помагали.
 
е аз точно затова пускам тук защото знам че ще намеря отговора.
и аз съм така.. като са много неща на главата , и човек забива от време на време :)
мерси отново. допълвам и с малко логика ако искаме да мапнем дадена позиция със random число, текст, varchar.. и тн.

PHP:
function rnum(int $n){
    echo substr(str_shuffle("0123456789"), 0, $n);
}
function rtxt(int $length) {
    return substr(str_shuffle(str_repeat($x='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);
}

.....
[
        [
            'sstr' => [0 , 3],
            'f' => 'xbo',
            'r' => 'X',
            't' => 'str'
        ],
        [
            'sstr' => [3 , 1],
            'f' => 's',
            'r' => 'D',
            't' => 'str'
        ],
        [
            'sstr' => [5 , 4],
            'f' => '4501',
            'r' => rtxt(3),
            't' => 'func'
        ],
        [
            'sstr' => [13 , 2],
            'f' => '01',
            'r' => rnum(3),
            't' => 'func'
        ],
]
    
f - find
r - replace
t - type ..
 

Back
Горе