I've a problem in my website (built with PHP script), I want to to summarize full name student ex: "Ahmad Najib Fuadi" from database to short name "A.N. Fuadi" in my website:
I already have database like this :
| FNAME | LNAME |
|--------------|----------|
| Ahmad Najib | Fuadi |
I have tried with code like this:
<tbody>
<?php if($query):foreach($query as $post):?>
<tr>
<td class="center"><?php echo $post->FNAME; ?></td>
<td class="center"><?php echo $post->LNAME ?></td>
</tr>
<?php endforeach; ?>
<?php endif;?>
</tbody>
I got no idea to short First Name (FNAME)
Thanks
Why not use a regex?
<tbody>
<?php if($query): foreach($query as $post): ?>
<tr>
<td class="center"><?php echo preg_replace('/(.)[^\s]+\s?/', '${1}.', strtoupper($post->FNAME)); ?></td>
<td class="center"><?php echo $post->LNAME; ?></td>
</tr>
<?php endforeach; endif; ?>
</tbody>
Try the following code:
$first = "Ahmad Najib";//fetch real first name from the database
$last = "Fuadi";//fetch real name from the database
$result = rtrim(preg_replace('#([^ ])[^ ]* *#i', '$1. ', $first)," ");
$result = "$result $last";
echo "$result";//or do something else with the shorter name
The method works quite robust, for instance double spaces (" "
) are interpreted as simply one space, etc.
You can test this code here.
Thus when merging this method with your own code, one gets:
<tbody>
<?php if($query):foreach($query as $post):?>
<tr>
<td class="center"><?php
$first = $post->FNAME;
$result = rtrim(preg_replace('#([^ ])[^ ]*[ ]*#i', '$1. ', $first)," ");
echo $result;
?></td>
<td class="center"><?php echo $post->LNAME ?></td>
</tr>
<?php endforeach; ?>
<?php endif;?>
I modify your code check and confirm
<?php if($query):foreach($query as $post):?>
<tr>
<td class="center">
<?php
$fname = $post->FNAME;
$firstName = getAbrName($fname); /// call function with pass first name
//$firstName = substr($fname,0,1).'.';
//if(strpos($fname,' ')){
// $firstName .= substr($fname,(strpos($fname,' ')+1),1).'.';
//}
echo $firstName;
?>
</td>
<td class="center"><?php echo $post->LNAME;?></td>
</tr>
<?php endforeach; ?>
<?php endif;?>
<?php function getAbrName($name = ''){
$nameArray = explode(' ',$name);
$returnName = '';
if(is_array($nameArray)){
foreach($nameArray as $value){
$returnName .= substr($value,0,1).'.';
}
}
return $returnName;
}
?>
Try my function getShortName
function getShortName($fname, $lname){
$name = '';
foreach(explode(' ', $fname) as $fn)
$name .= strtoupper($fn[0]) . '. ';
$name .= ucfirst($lname);
return $name;
}
Testing Data:
$names = array(
array('fname' => 'Ahmad', 'lname' => 'Fuadi'),
array('fname' => 'Ahmad Najib', 'lname' => 'Fuadi'),
array('fname' => 'Ahmad najib mama', 'lname' => 'Fuadi'),
array('fname' => 'ahmad baba Mama', 'lname' => 'Fuadi'),
array('fname' => 'allen iverson', 'lname' => 'chak')
);
foreach($names as $n)
print(getShortName($n['fname'], $n['lname']) . "<br />");
Testing Result:
A. Fuadi
A. N. Fuadi
A. N. M. Fuadi
A. B. M. Fuadi
A. I. Chak
Something like below .
Irrespective of how many parts FNAME is made up of , this will only consider maximum of first two parts from the left .
SELECT
CONCAT
(
SUBSTR( FNAME ,1 ,1 ) ,'.'
,IF
(
LOCATE( ' ' ,FNAME ) > 0
,CONCAT( SUBSTR( FNAME FROM ( 1 + LOCATE( ' ' ,FNAME ) ) FOR 1 ) ,'.' )
,''
)
,' '
,LNAME
) AS short_name
FROM table_name
So :Ahmad
, Fuadi
results : A. Fuadi
Ahmad Najib
, Fuadi
results : A.N. Fuadi
Ahmad Najib Mahmood
, Fuadi
also results : A.N. Fuadi