2013-07-07 4 views
0

Я пытаюсь создать список членов со всеми членами в базе данных, однако они находятся там на основе имени. Поэтому я пытаюсь сначала поместить фамилию, прежде чем печатать их.make array of names php

Для этого я написал эту функцию:

function surname($name){ 
    $exploded = explode(" ", $name); 
    $num = count($exploded); 

    $move = $exploded[$num - 1]; 
    unset($exploded[$num - 1]); 
    array_unshift($exploded, $move); 
    $name = implode(", ", $exploded); 
    return $name; 
} 

И при использовании, что я пытаюсь сделать массив справедливо называют людей. (Потому что MySQL сортирует по лицевому имени вместо фамилии, поэтому я хочу, чтобы отсортировать aftarwards массива)

   $names = array(); 
       $sql = "SELECT * FROM Members"; 
       $self = mysql_query($sql); 
       while ($row = mysql_fetch_array($self)) { 
        $name = $row["name"]; 
        $name = surname($name); 
        array_push($names, $name); 
       }    
       echo $names; 

Это, однако, не дает ничего взамен, я думаю, это потому, что массив переделывается каждый цикл.

Итак, мой вопрос, это правильный способ сделать это или мне нужно сделать что-то совершенно другое?

Пожалуйста, помогите.

+0

с регулярным выражением вы можете сделать, что 'surname' функция простой один лайнер:' возвращение preg_replace ('/ (\ W +) \ s + (\ w +)/',' $ 2, $ 1 ', $ name); ' – elclanrs

+0

Но это работает только в том случае, если имеется только 2 слова? Имена, которые у меня есть, могут иметь 2 или более. (Думаю, 4 это текущий макс, но я хочу оставаться открытым для людей с сумасшедшими именами) – Coolcrab

+0

Имена практически невозможно проверить, что бы вы ожидали от «Miguel Perez de Francisco», например? Мой код выше ошибочен, но так же все остальные решения, потому что имена непредсказуемы. В идеале у вас было бы два разных поля: одно для имени и одно для фамилии и хранить их отдельно в БД, но, похоже, слишком поздно это делать ... – elclanrs

ответ

0

Нечто подобное может работать отметить его непроверенных хотя

SELECT * FROM Members ORDER BY SUBSTRING_INDEX(name, ' ', -2)

Он должен выбрать первые 2 слова, которые появляются справа от первого места. Это должно допускать среднее имя и фамилию.

OK Это будет работать слишком грязно/тяжело, но работает. Его ужасно с петлей в петлю, но не хватает фиксации вашей БД для правильной структуры это так хорошо, как вы получите (если вы не хотите идти в черную магию регулярных выражений.

$surnamesarray = array(); 
$sql = "SELECT * FROM Members"; 
       $self = mysql_query($sql); 
       while ($row = mysql_fetch_array($self)) { 
        $temparray = explode(" ",$row['name']); 
        $substring = ""; 
        for ($i=0;$i<count($temparray);$i++) { 
        $substring .= " ".$temparray[$i]; 
        } 
        $surnamesarray[] = trim($substring) 
       } 

// now we just array sort so 
sort($surnamesarray); 
var_dump($surnamesarray);//you would now for each this array again to display i'm just dumping out here 
+0

Но что, если у них нет среднего имени? И у некоторых есть 2, как «Van Der» – Coolcrab

+0

, он все равно будет работать, он будет соответствовать двум записям после пробела, если вам нужно разрешить 3 имени (я думал, что ван-дер всегда гифонизирован, доказывает, насколько я знаю) измените его до -3 или -4 или -5, если вы хотите быть действительно безопасным. – Dave

+0

Кажется, что это точно соответствует тем, которые соответствуют ему. поэтому те, которые занимаются 3 долгами, все остальные не – Coolcrab

0

в цикле, изменить второй $name к $names[] тогда не эхо, но print_r($names) и попробуйте удалить толчок массива