У меня есть образец массива, как это:
[
"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"]
Вам нужно иметь массив для ваших ожидаемых валют, а затем фильтровать по нему.
Вот быстрое и грязное решение: 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);
Вы всегда обрезаете правую сторону струны, просто используйте 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$/
немного быстрее.)
Вот ответ, который похож на ответ Эдвина, но, вероятно, быстрее.
Я использую 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);