Php 我会使用mb_substr字符串来执行此操作吗?

Php 我会使用mb_substr字符串来执行此操作吗?,php,arrays,multibyte,Php,Arrays,Multibyte,我正在寻找一种方法,只删除数组中以元音开头的元素。所以亚当会被删除,爱德华会被删除等等。我的朋友告诉我,要做到这一点,我将使用和相关的函数 但我不知道这会是什么样子,甚至不知道为什么我会使用多字节字符串操作来实现这一点。有人能告诉我如何从数组中删除以元音开头的所有元素吗 因为我把一些人弄糊涂了 如果数组如下所示: $array = array( array('title' => 'apples'), array('title' => 'jack') ) 然后苹果会被

我正在寻找一种方法,只删除数组中以元音开头的元素。所以亚当会被删除,爱德华会被删除等等。我的朋友告诉我,要做到这一点,我将使用和相关的函数

但我不知道这会是什么样子,甚至不知道为什么我会使用多字节字符串操作来实现这一点。有人能告诉我如何从数组中删除以元音开头的所有元素吗

因为我把一些人弄糊涂了

如果数组如下所示:

$array = array(
    array('title' => 'apples'),
    array('title' => 'jack')
)
然后苹果会被移除,而杰克不会,因为它不是以元音开头的

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

array\u filter
返回一个新数组,该数组的元素都是函数为true的元素
$x
是要筛选的数组的元素,
$x['title'][0]
是其title元素值的第一个字符
stristr
对第一个参数执行不区分大小写的搜索,因此它检查第一个字符是否在元音字符串中。如果找到它,
stristr()
返回位置,否则返回false<代码>反转此值的真值,因此如果第一个字符不是元音,则函数返回真值。

使用
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]);
    }
}

您希望使用哪种语言/一组元音?如果是英语和
aeiou
,那么这里不需要多字节函数,大小写闭合。但让我们更有趣一点,假设我们希望波兰语输入有9个元音:
aeiouyąęó

现在的问题是编码。现在是2013年,每个人都应该使用
utf8
,但我们都知道,有些人只是想看着世界燃烧,仍然使用
iso-8859-2
,甚至更糟糕的
windows-1250
。如果我们知道,那就太好了,我们可以继续前进-如果是
utf8
,那么就需要多字节函数ed,其余两个不需要


然而,如果数据来自不同的来源,你无法确定它的编码,但仍然必须正确地响应所有情况……那么,我为你感到抱歉,因为很难确定真正的编码。但你肯定需要mb_*函数。

你在使用多字节字符串(可能是UTF-8)吗?您的问题中没有任何内容表明您正在处理什么类型的数据。
foreach($array as$index=>$element){$first=mb_substr($element,0,1,$encoding);if(in_array($first,$元音)){unset($array[$index]);}
,定义构成“元音”的字符列表"所有受支持的字母表都由您决定。@JohnFlatness抱歉,我只使用了一个key=>value的常规数组,但我的朋友曾经说过,对于我想做的事情,我应该使用多字节字符串操作functions@DCoder什么是编码?或者$encoding?在哪里定义的?我假设$元音就是我定义的元音?或者s元音集?那是一个数组吗?一个串联字符串吗?我能理解你想删除每个数组键值的第一个单词吗?我不知道这有什么用。抱歉。稍后将解释(一旦我调试它)在某些语言中,元音可以是multibyte@MichelFeldheim我不知道用多语言测试元音的方法。请随意发布一个解决这个问题的答案。我怀疑任何关心第一个字母是否是元音的应用程序本质上都是语言特定的(例如,在英语中,在单词前加上“a”或“an”)。您使用的
$value['title'][0]
可能会破坏未知的多字节字符串,并且在已知的非多字节元音集上使用
mb_stristr
。您使用的哪个字符串会破坏它?当然,它会在测试用例中工作,因为被破坏的多字节字符不会是元音。我是说您的使用是错误的,毫无意义。