2012-04-20 16 views
7

Mam tablicę, w której inna litera w każdym słowie jest kapitał jak:Get pozycji pierwszej litery w ciągu znaków za pomocą php

jabłko, pomarańcza, banan, mango, papaja

Chcę uzyskać pozycję pierwszej litery, która jest kapitałem. I odpowiednio je uporządkuj. To jest słowo, które ma pierwsza litera będzie pierwszy, a potem drugi litera będzie drugim itd ... Jak

Pomarańczowy
Papaya
aAple
mango
banan

Jeśli dwa słowa mają wielką literę na tej samej pozycji, na przykład na powyższej liście Orange i Pappaya zawierają pierwszą literę jako kapitał, a następnie muszą być posortowane alfabetycznie porządek etyczny.

Czy to jest bardzo trudne do osiągnięcia w php?

+0

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

Odpowiedz

11

Można użyć strcspn()

długość Znajdują początkowego segmentu nie pasujące maski

Na przykład:

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

Pełna Kodeksu

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

Wyjście

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

Ta funkcja służy do sortowania wstecznego.

+4

Jeśli nie podoba ci się pomysł posiadania całego alfabetu (z dowolnego powodu), możesz użyć 'strcspn ('aAple', implode ('', range ('A', 'Z')));' –

+1

@RobinCastlin Twoja instrukcja 'implode' zapisuje tylko jeden znak ;-) –

+0

Tak, to prawda . Ale raczej pozwolić systemowi przejść od A do Z, a następnie samemu go napisać. : D Może zapomnę list! –

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

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

Jest tak wiele sposobów na zrobienie tego. Użyj najbardziej logicznego. :)

Ten po prostu zwraca pierwszą część łańcucha do pierwszej litery. Następnie obliczyć długość ciągu i odjąć od 1.

1

Jeśli używasz PHP> 5.3 można użyć to:

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

W przeciwnym razie trzeba utworzyć inną funkcję jako zamiennik dla funkcji lambda.

wyjściowa: 1, 0, 2, 1, 0

0

Jeśli chcesz non-fantazyjny sposób to zrobić, tutaj jest moja propozycja:

** dla gettings czapki pozycja *

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

Użyć tablica asocjacyjna do przechowywania pozycji Caps w tablicy .eg array ['aPple'] = '1' i tak dalej. następnie użyj funkcji sortowania php, aby je posortować. Funkcje sortowania PHP można znaleźć pod adresem: http://php.net/manual/en/array.sorting.php

Powiązane problemy