Как убрать валютные сокращения с правой стороны строк?

У меня есть образец массива, как это:

[
"BTCUSD",
"DASHBTC",
"DOGEUSD",
"LTCBTC",
"LTCUSD",
"SCBTC",
"STEEMBTC",
"WAVESBTC",
"SNGLSBTC",
"1STBTC",
"DASHUSD",
"BQXETH",
"PTOYETH",
"XAURETH",
"BTCUSDT"]

Как получить только одну валюту для каждой строки? Я не могу использовать разнесение, потому что нет единственного / статического разделителя. Я не могу использовать substr() или же strpos() потому что подстроки меняются.

Так как это разделить?

Обновить

Это мой ожидаемый результат

[
"BTC",
"DASH",
"DOGE",
"LTC",
"LTC",
"SC",
"STEEM",
"WAVES",
"SNGLS",
"1ST",
"DASH",
"BQX",
"PTOY",
"XAUR",
"BTC"]

-4

Решение

Вам нужно иметь массив для ваших ожидаемых валют, а затем фильтровать по нему.

Вот быстрое и грязное решение: https://3v4l.org/6mMbN или с рекурсивным вызовом функции: https://3v4l.org/mhjBD

<?php

$currencies = [
'USD',
'BTC',
'DASH',
'LTC',
'SC',
'STEEM',
'WAVES',
'SNGLS',
'1ST',
'BQX',
'ETH',
'PTOY',
'XAUR',
];

$input = [
"BTCUSD",
"DASHBTC",
"DOGEUSD",
"LTCBTC",
"LTCUSD",
"SCBTC",
"STEEMBTC",
"WAVESBTC",
"SNGLSBTC",
"1STBTC",
"DASHUSD",
"BQXETH",
"PTOYETH",
"XAURETH",
"BTCUSDT",
];

$output=[];
foreach($input as $doubleCurrency){
foreach($currencies as $currency){
$pattern = '/^'.$currency. '/';
preg_match($pattern, $doubleCurrency, $matches);
if(array_key_exists(0, $matches)){
$output[]=$matches[0];
}
}
}

var_dump($output);
1

Другие решения

Вы всегда обрезаете правую сторону струны, просто используйте preg_replace() с конца строки привязки. Массив поиска не требуется. Это не намного легче, что это:

Код: (демонстрация)

$input=[
"BTCUSD",
"DASHBTC",
"DOGEUSD",
"LTCBTC",
"LTCUSD",
"SCBTC",
"STEEMBTC",
"WAVESBTC",
"SNGLSBTC",
"1STBTC",
"DASHUSD",
"BQXETH",
"PTOYETH",
"XAURETH",
"BTCUSDT"];

var_export(preg_replace('/USDT$|USD$|ETH$|BTC$/','',$input));

Выход:

array (
0 => 'BTC',
1 => 'DASH',
2 => 'DOGE',
3 => 'LTC',
4 => 'LTC',
5 => 'SC',
6 => 'STEEM',
7 => 'WAVES',
8 => 'SNGLS',
9 => '1ST',
10 => 'DASH',
11 => 'BQX',
12 => 'PTOY',
13 => 'XAUR',
14 => 'BTC',
)

(Шаблон может быть сжат, если вы не возражаете против синтаксиса. /USDT?$|ETH$|BTC$/ немного быстрее.)

1

Вот ответ, который похож на ответ Эдвина, но, вероятно, быстрее.
Я использую str_replace для создания пробела между валютами, затем зацикливаю новый массив и удаляю что-либо после первого пробела.

Пример:
«STEEMBTC» становится STEEM BTC ».
Затем подставьте его в: «STEEM».

Вероятно, более быстрый код, поскольку он зацикливается и не использует регулярные выражения.

$currencies = [
'USD',
'BTC',
'DASH',
'LTC',
'SC',
'STEEM',
'WAVES',
'SNGLS',
'1ST',
'BQX',
'ETH',
'PTOY',
'XAUR',
'DOGE'
];

$repl = [
'USD ',
'BTC ',
'DASH ',
'LTC ',
'SC ',
'STEEM ',
'WAVES ',
'SNGLS ',
'1ST ',
'BQX ',
'ETH ',
'PTOY ',
'XAUR ',
'DOGE '
];

$input = [
"BTCUSD",
"DASHBTC",
"DOGEUSD",
"LTCBTC",
"LTCUSD",
"SCBTC",
"STEEMBTC",
"WAVESBTC",
"SNGLSBTC",
"1STBTC",
"DASHUSD",
"BQXETH",
"PTOYETH",
"XAURETH",
"BTCUSDT",
];

$new = str_replace($currencies, $repl, $input);
Foreach($new as &$item){
$item = substr($item, 0, strpos($item, " "));
}

Var_dump($new);

https://3v4l.org/QDMjS

0
По вопросам рекламы [email protected]