8

我有一个数组,其中每个单词中的不同字母都是大写的,例如:

苹果、橙子、香蕉、芒果、木瓜

我想得到第一个大写字母的位置。并相应地订购它们。那就是第一个大写字母的单词是第一个,然后是第二个字母大写的单词,依此类推......就像


木瓜
aAple
芒果
香蕉

如果两个单词的大写字母位于相同的位置,例如上面的列表 Orange 和 Pappaya 的首字母大写,那么它们必须按字母顺序排序。

这在php中很难实现吗?

4

4 回答 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

您使用该功能进行(反向)排序。

于 2012-04-20T07:39:12.867 回答
1
preg_match("/^.*?[A-Z]/", 'aAple', $arr);

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

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

这只是将字符串的第一部分返回到第一个大写字母。然后我计算字符串长度并减去 1。

于 2012-04-20T07:41:18.210 回答
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

于 2012-04-20T08:00:49.863 回答
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;
    }
  }
 }

使用关联数组将 Caps 位置存储在数组中。例如 array['aPple'] = '1' 等等。然后使用php排序函数对其进行排序。PHP 排序函数可以在以下位置找到: http: //php.net/manual/en/array.sorting.php

于 2012-04-20T09:32:37.983 回答