У меня есть fname и lname в моей базе данных, и имя может быть сохранено как JOHN DOE или john DOE или JoHN dOE, но в конечном итоге я хочу показать его как John Doe
fname – это John, а lname – Doe
видя, что он помечен PHP:
или
string ucfirst ( string $str );
в верхнюю букву первого слова первого слова
или
string ucwords ( string $str );
в верхний регистр первой буквы каждого слова
вы можете использовать их в сочетании с
string strtolower ( string $str );
сначала нормализовать все имена в нижнем регистре.
Имейте в виду, что существуют другие форматы капитализации, такие как Джон МакДо, Джон Д'О, Джон де О и Джон ван ден Доу.
Я не уверен, где и как вы хотите отображать его, но если он находится на веб-странице, вы можете попробовать просто изменить отображение с помощью CSS. Попробуйте добавить:
text-transform:capitalize;
к соответствующему правилу, например:
.name { text-transform:capitalize;}
если вы поместите имя в div или span с классом = "name". Конечно, это никоим образом не изменит запись в базе данных, но я не понял, что было предпочтительнее.
Пример из php.net :
$bar = 'HELLO WORLD!'; $bar = ucfirst($bar); // HELLO WORLD! $bar = ucfirst(strtolower($bar)); // Hello world!
Имейте в виду заметки о местах, хотя …
Для простых имен это будет работать. Остерегайтесь особых случаев (например, «Рональд Макдональд» в приведенном ниже примере).
В SQL Server:
SELECT --step 2: combine broken parts into a final name NAME_PARTS.FNAME_INITIAL + NAME_PARTS.REST_OF_FNAME AS FNAME ,NAME_PARTS.LNAME_INITIAL + NAME_PARTS.REST_OF_LNAME AS LNAME FROM ( --step 1: break name into 1st letter and "everything else" SELECT UPPER(SUBSTRING(TEST.FNAME,1,1)) AS FNAME_INITIAL ,UPPER(SUBSTRING(TEST.LNAME,1,1)) AS LNAME_INITIAL ,LOWER(SUBSTRING(TEST.FNAME,2,LEN(TEST.FNAME))) AS REST_OF_FNAME ,LOWER(SUBSTRING(TEST.LNAME,2,LEN(TEST.LNAME))) AS REST_OF_LNAME FROM ( --step 0: generate some test data SELECT 'john' AS FNAME, 'doe' as LNAME UNION SELECT 'SUZY', 'SMITH' UNION SELECT 'bIlLy', 'BOb' UNION SELECT 'RoNALD', 'McDonald' UNION SELECT 'Edward', NULL UNION SELECT NULL, 'Jones' ) TEST ) NAME_PARTS
В Oracle
SELECT --step 2: combine broken parts into a final name NAME_PARTS.FNAME_INITIAL || NAME_PARTS.REST_OF_FNAME AS FNAME ,NAME_PARTS.LNAME_INITIAL || NAME_PARTS.REST_OF_LNAME AS LNAME FROM ( --step 1: break name into 1st letter and "everything else" SELECT UPPER(SUBSTR(TEST.FNAME,1,1)) AS FNAME_INITIAL ,UPPER(SUBSTR(TEST.LNAME,1,1)) AS LNAME_INITIAL ,LOWER(SUBSTR(TEST.FNAME,2,LENGTH(TEST.FNAME))) AS REST_OF_FNAME ,LOWER(SUBSTR(TEST.LNAME,2,LENGTH(TEST.LNAME))) AS REST_OF_LNAME FROM ( --step 0: generate some test data SELECT 'john' AS FNAME, 'doe' as LNAME FROM DUAL UNION SELECT 'SUZY', 'SMITH' FROM DUAL UNION SELECT 'bIlLy', 'BOb' FROM DUAL UNION SELECT 'RoNALD', 'McDonald' FROM DUAL UNION SELECT 'Edward', NULL FROM DUAL UNION SELECT NULL, 'Jones' FROM DUAL ) TEST ) NAME_PARTS
Объединение сокращенных функций PHP strtolower и ucwords решает вашу проблему:
function ucname($f, $l) { return ucwords(strtolower($f." ".$l)); } echo ucname($fname, $lname);
Обратите внимание на то, что вы можете сделать такую сортировку данных на разных этапах:
Измените имена на нижние и затем добавьте («A» – «a») к первой букве имени fname & lname.