将全名汇总为短名称。

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