2012-12-31 3 views
0

Я ищу способ удалить только те элементы в массиве, которые начинаются с гласного. поэтому adam будет удален, edward будет удален и т. д. и т. д. Мой друг сказал мне, что для этого я бы использовал mb_substr и связанные функции.Могу ли я использовать строку mb_substr для этого?

Но я потерял, как это будет выглядеть или даже почему я буду использовать манипуляции с несколькими байт-строками. Может кто-то один момент мне в правильном направлении, пожалуйста, о том, как вы бы удалить все элементы, начиная с гласной из массива

Потому что я смущал некоторые человек

Если массив выглядит следующим образом:

$array = array(
    array('title' => 'apples'), 
    array('title' => 'jack') 
) 

тогда яблоки будут удалены, а гнездо не будет, потому что это не начинается с гласного.

+0

Вы работаете с многобайтовыми строками (возможно, UTF-8)? В вашем вопросе нет ничего, что указывало бы, с какими данными вы имеете дело. –

+0

'foreach ($ array as $ index => $ element) {$ first = mb_substr ($ element, 0, 1, $ encoding); if (in_array ($ first, $ vowels)) {unset ($ array [$ index]); }} '. Определение списка символов, которые составляют «гласные» во всех поддерживаемых алфавитах, зависит от вас. – DCoder

+0

@JohnFlatness Извините, что я работал с обычным массивом key => value, как бы мой друг не сказал, что для чего я хочу сделать, я должен использовать функции управления несколькими байтами строк – TheWebs

ответ

0
$new_array = array_filter(
    $array, 
    function($x) { 
     return !stristr('aeiou', $x['title'][0]); 
    } 
); 

array_filter возвращает новый массив, элементами которого являются все те, для которых функция верно. $x - это элементы фильтруемого массива, а $x['title'][0] - это первый символ значения его элемента заголовка. stristr выполняет независимый от регистра поиск первого аргумента, поэтому он проверяет, находится ли этот первый символ в строке гласных. Если он найден, stristr() возвращает позицию, в противном случае возвращает false; ! инвертирует значение истины, поэтому функция возвращает true, если первый символ равен , а не - гласный.

+0

Я понятия не имею, что это извиняет. – TheWebs

+0

Вкратце объясню (как только я его отлажу) – Barmar

+0

На некоторых языках гласные могут быть многобайтными –

-1

Только причина, по которой вы хотели бы использовать mb_*, - это когда вы работаете со строками, которые не являются ASCII (например, «ふ ー ば ー»). Но в вашем случае, поскольку вы ищете только гласные, это было бы бессмысленно.

// go over each element in the array 
foreach ($array as $key => $value) 
{ 
    //check if the first character of the title is a vowel (ignore case, ie 'a' or 'A') 
    if (stristr("aeiou", $value['title'][0])) 
    { 
     // remove it from the array 
     unset($array[$key]); 
    } 
} 
+1

Вы используете '$ value ['title'] [0]', который может разорвать неизвестную, возможно, многобайтную строку, и 'mb_stristr' на известном, не многобайтном наборе гласных. –

+0

Какую строку вы использовали, чтобы сломать ее? – Supericy

+1

Конечно, он будет работать на тестовых случаях, так как сломанный многобайтовый символ не будет гласным. Я говорю, что ваше использование неверно и бессмысленно. –

2

Какой язык/набор гласных вы ожидаете? Если это английский и aeiou, то здесь вам не нужна многобайтовая функция, закрывается случай. Но давайте сделаем это более интересным, скажем, мы ожидаем польского ввода, который имеет 9 гласных: aeiouyąęó.

Теперь проблема с кодировкой. Это 2013 год, и каждый должен использовать utf8, но, как мы все знаем, некоторые люди просто хотят посмотреть, как горит мир и все еще используют iso-8859-2 или еще хуже windows-1250. Если мы это знаем, это здорово, мы можем двигаться дальше - если это utf8 чем да, потребуется многобайтовая функция, а для остальных двух она не нужна.

Однако, если данные поступают из разных источников, и вы не можете определить его кодировку, но должны правильно отвечать на все случаи ... Ну, тогда мне жаль вас, так как трудно определить реальную кодировку. Но вам наверняка понадобятся функции mb_ *.