2012-04-20 75 views
7

Tôi gặp mảng trong đó lá thư khác nhau trong mỗi từ là vốn như:Lấy vị trí của chữ cái viết hoa đầu tiên trong một chuỗi sử dụng php

táo, cam, chuối, xoài, đu đủ

Tôi muốn lấy vị trí của chữ cái đầu tiên là vốn. Và ra lệnh cho phù hợp. Đó là từ mà có vốn chữ cái đầu tiên sẽ là người đầu tiên, và sau đó có vốn đầu lá thư thứ hai sẽ là thứ hai vv ... Giống như

Orange
Đu đủ
aAple
Mango
chuối

Nếu hai từ đi kèm với chữ in hoa ở cùng một vị trí, ví dụ như trong danh sách trên Cam và Pappaya có chữ cái đầu tiên là vốn, thì chúng phải được sắp xếp theo bảng chữ cái trật tự etic.

Điều này có khó thực hiện trong php không?

+0

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

Trả lời

11

Bạn có thể sử dụng strcspn()

Tìm chiều dài của phân khúc ban đầu không phù hợp với mặt nạ

Ví dụ:

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

Full Mã

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

Đầu ra

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

Bạn sử dụng chức năng đó để sắp xếp (đảo ngược).

+4

Nếu bạn không thích ý tưởng có toàn bộ bảng chữ cái (vì bất kỳ lý do gì), bạn có thể sử dụng 'strcspn ('aAple', implode ('', range ('A', 'Z')));' –

+1

@RobinCastlin Câu lệnh 'implode' của bạn chỉ tiết kiệm một ký tự ;-) –

+0

Vâng, đúng vậy . Nhưng tôi thà để hệ thống đi từ A đến Z rồi tự đánh máy. : D Có lẽ tôi quên một lá thư! –

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

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

Có rất nhiều cách để bạn có thể thực hiện việc này. Sử dụng cái bạn thấy hợp lý nhất. :)

Điều này chỉ trả về phần đầu tiên của chuỗi cho chữ cái viết hoa đầu tiên. Sau đó, tôi tính toán chiều dài chuỗi và trừ bằng 1.

1

Nếu bạn sử dụng PHP> 5.3 bạn có thể sử dụng này:

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

Nếu không, bạn phải tạo ra một chức năng để thay thế cho hàm lambda.

Output: 1, 0, 2, 1, 0

0

Nếu bạn muốn có một cách không ưa thích để làm điều đó, đây là đề nghị của tôi:

** cho gettings mũ vị trí *

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

Sử dụng một mảng kết hợp để lưu trữ Caps posn trong mảng .eg mảng ['aPple'] = '1' v.v. sau đó sử dụng chức năng sắp xếp php để sắp xếp nó. Bạn có thể tìm thấy các chức năng sắp xếp PHP tại: http://php.net/manual/en/array.sorting.php

Các vấn đề liên quan