PHP: Розбийте рядок на масив, як вибух без роздільника


75

У мене є рядок, такий як:

"0123456789"

і потрібно розділити КОЖНИЙ символ на масив.

Я на біс спробував:

explode('', '123545789');

Але це дало мені очевидне: Попередження: У вибуху не визначено жодного роздільника) ..

Як би я натрапив на це? Я не бачу жодного методу, особливо лише функції

Відповіді:


133
$array = str_split("0123456789bcdfghjkmnpqrstvwxyz");

str_split бере необов'язковий 2-й параметр, довжину фрагмента (за замовчуванням 1), тому ви можете робити такі речі:

$array = str_split("aabbccdd", 2);

// $array[0] = aa
// $array[1] = bb
// $array[2] = cc  etc ...

Ви також можете отримати частини свого рядка, обробляючи його як масив:

$string = "hello";
echo $string[1];

// outputs "e"

Ага. Пропустивши цю функцію, було розбито двійкові числа для обчислення в масиві, це добре працює.
oni-kun

1
А як щодо кодування?
kicaj

PHP не розуміє кодування. Він просто розділить рядок на байти, тому будь-які багатобайтові символи будуть переплутані. PHP6 мав це виправити, але цього не сталося.
bdsl

@kicaj У коментарях на php.net/mb_split ви можете побачити функцію, написану adjwilli, яка повинна розділити рядок UTF8 на символи.
bdsl

19

Що ви намагаєтесь досягти? Ви можете отримати доступ до символів у рядку, як і до масиву:

$s = 'abcd';
echo $s[0];

друкує " а "


6

Спробуйте це:

$str = '123456789';
$char_array = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);

Це дійсно непотрібно, і зовсім трохи повільніше, ніж str_split.
Ерік

@Erik: Ні, якщо вам потрібно повернути порожній масив на випадок, якщо $strдовжина не має.
hakre

@hakre У цьому випадку було б достатньо швидко швидше просто зробити перевірку strlen $strі встановити, $char_array = array()якщо strlenповертає 0.
Тревіс Уестон

5

str_splitможе зробити трюк. Зверніть увагу, що рядки в PHP можна отримати так само, як масив символів, у більшості випадків вам не потрібно буде розділяти рядок на "новий" масив.


4

Ось приклад, який працює з багатобайтовими (UTF-8) рядками.

$str = 'äbcd';

// PHP 5.4.8 allows null as the third argument of mb_strpos() function
do {
    $arr[] = mb_substr( $str, 0, 1, 'utf-8' );
} while ( $str = mb_substr( $str, 1, mb_strlen( $str ), 'utf-8' ) );

Це також можна зробити за допомогою preg_split()( preg_split( '//u', $str, null, PREG_SPLIT_NO_EMPTY )), але на відміну від наведеного вище прикладу, який працює майже так само швидко, незалежно від розміру рядка, preg_split()швидко з малими рядками, але набагато повільніше з великими.


2

Спробуйте це:

    $str = '546788';
    $char_array = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);

2

Спробуйте це:

$str = "Hello Friend";

$arr1 = str_split($str);
$arr2 = str_split($str, 3);

print_r($arr1);
print_r($arr2);

Наведений вище приклад виведе:

Array
(
    [0] => H
    [1] => e
    [2] => l
    [3] => l
    [4] => o
    [5] =>
    [6] => F
    [7] => r
    [8] => i
    [9] => e
    [10] => n
    [11] => d
)

Array
(
    [0] => Hel
    [1] => lo
    [2] => Fri
    [3] => end
)

0

Якщо ви хочете розділити рядок, найкраще використовувати:

$array = str_split($string);

Коли у вас є роздільник, який відокремлює рядок, ви можете спробувати,

explode('' ,$string);

Де ви можете передати роздільник у першу змінну всередині вибуху, наприклад:

explode(',',$string);

0
$array = str_split("$string");

дійсно буде працювати досить добре, АЛЕ якщо ви хочете зберегти спеціальні символи в цьому рядку, і ви хочете зробити з ними певні маніпуляції, ЧИМ я б не використав

do {
    $array[] = mb_substr( $string, 0, 1, 'utf-8' );
} while ( $string = mb_substr( $string, 1, mb_strlen( $string ), 'utf-8' ) );

оскільки для деяких моїх особистих потреб це виявилося більш надійним, коли виникає проблема зі спеціальними символами

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.