2012-04-20 17 views
7

estoy teniendo matriz en la que una letra diferente en cada palabra es de capital como:Obtener la posición de la primera letra mayúscula en una cadena utilizando php

manzana, naranja, plátano, mango, papaya

Quiero obtener la posición de la primera letra que es capital. Y pídalos en consecuencia. Esa es la palabra que tiene la primera letra mayúscula serán primeros, y luego con la segunda letra mayúscula será el segundo etc ... Como

Naranja
Papaya
Aaple
Mango
Plátano

Si dos palabras vienen con mayúscula en la misma posición, por ejemplo, en la lista anterior Naranja y Pappaya vienen con la primera letra como mayúscula, luego deben ordenarse en alfab etic orden.

¿Es esto muy difícil de lograr en php?

+0

http://mattgemmell.com/2008/12/08/what-have-you-tried – Jashwant

Respuesta

11

Usted podría utilizar strcspn()

Encuentra la longitud del segmento inicial no coincide con la máscara

Por ejemplo:

echo strcspn('aAple', 'ABCDEFGHJIJKLMNOPQRSTUVWXYZ'); 
// prints '1' - the string starts with 1 character not in upper case 

Código completo

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

Salida

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

Utilice esta función para hacer su clasificación (inversa).

+4

Si no le gusta la idea de tener todo el alfabeto (por el motivo que sea), puede usar 'strcspn ('aAple', implode ('', range ('A', 'Z')))' –

+1

@RobinCastlin Su sentencia 'implode' guarda solo un carácter ;-) –

+0

Sí, eso es verdad . Pero prefiero dejar que el sistema vaya de A a Z y luego escribirlo yo mismo. : D Tal vez me olvido una carta! –

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

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

Hay muchas formas de hacerlo. Usa el que encuentres más lógico. :)

Éste simplemente devuelve la primera parte de la cadena a la primera letra mayúscula. Entonces calcular la longitud de la cadena y restar 1.

1

Si utiliza PHP> 5.3 se puede utilizar este:

$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)); 

lo contrario tendrá que crear otra función que la sustitución de la función lambda.

Salida: 1, 0, 2, 1, 0

0

Si desea una forma de fantasía no hacerlo, aquí está mi sugerencia:

** para gettings tapas posición *

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; 
    } 
    } 
} 

uso de un matriz asociativa para almacenar las Caps posn en la matriz .eg array ['aPple'] = '1' y así sucesivamente. luego usa las funciones de clasificación php para ordenarlo. Las funciones de clasificación de PHP se pueden encontrar en: http://php.net/manual/en/array.sorting.php

Cuestiones relacionadas