使用PHP获取字符串中第一个大写字母的位置

8
我有一个数组,其中每个单词中的不同字母都是大写的,像这样:

aPple, Orange, baNana, mANgo, Papaya

我想获取第一个大写字母的位置,并相应地排序。
也就是说,首字母大写的单词将排在第一位,其次是第二个字母大写的单词,以此类推。如下所示:

Orange
Papaya
aAple
mAngo
baNana

如果两个单词的大写字母出现在同一位置,例如以上列表中的“Orange”和“Papaya”都使用大写字母作为首字母,则它们必须按字母顺序排序。
在php中实现这个功能很难吗?

http://mattgemmell.com/2008/12/08/what-have-you-tried - Jashwant
4个回答

12
您可以使用 strcspn() 函数来查找不匹配掩码的初始段长度。例如:
echo strcspn('aAple', 'ABCDEFGHJIJKLMNOPQRSTUVWXYZ');
// prints '1' - the string starts with 1 character not in upper case

完整代码

echo "<pre>" ;
$array = array("aPple", "Orange", "baNana", "mANgo", "Papaya");
foreach($array as $value)
{
    echo $value , "= " , strcspn($value, 'ABCDEFGHJIJKLMNOPQRSTUVWXYZ') . PHP_EOL;
}

输出

aPple= 1
Orange= 0
baNana= 2
mANgo= 1
Papaya= 0

你可以使用该函数进行(反向)排序。


4
如果你不喜欢完整的字母表(无论出于什么原因),你可以使用strcspn('aAple', implode('', range('A', 'Z'))); - Robin Castlin
1
@RobinCastlin,你的implode语句只能节省一个字符而已;-) - Ja͢ck
1
是的,那是真的。但我宁愿让系统从头到尾自动输入,而不是自己打字。 :D 也许我会忘记一个字母! - Robin Castlin

1
preg_match("/^.*?[A-Z]/", 'aAple', $arr);

$str_position = (strlen($arr[0]) - 1);

有很多方法可以做到这一点。使用你认为最合乎逻辑的方法就好。:)

这个方法只是简单地返回字符串中第一个大写字母之前的部分。然后我计算字符串的长度并减去1。


1
如果您使用的是 PHP > 5.3 版本,您可以使用以下代码:
$test = array("aPple", "Orange", "baNana", "mANgo", "Papaya");

echo implode(', ', array_map(function($value){
    $matches = array();
    preg_match('/[A-Z]/', $value, $matches, PREG_OFFSET_CAPTURE);
    return $matches[0][1];
}, $test));

否则,您必须创建另一个函数来替换lambda函数。
输出:1, 0, 2, 1, 0


1
如果你想要一种简单的方法来实现它,这是我的建议:
** 获取大写字母位置 *
 function getCapsPosn($str)
 {
  $i = 0;
  $CapsPosn = -1;
  for ($i =0 ; $i < strlen($str) ; $i++)
  {
    if (( ord($str[$i]) >= 65 ) && ( ord($str[$i]) <= 90))
    {
        //echo ord($str[$i]);
        $CapsPosn = $i;
        return $CapsPosn;
    }
  }
 }

使用关联数组来存储大写字母在数组中的位置,例如:array['aPple'] = '1',然后使用PHP排序函数进行排序。可以在http://php.net/manual/en/array.sorting.php找到PHP排序函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接