Сортировать PHP по алфавиту по фамилии, затем по имени

1

У меня есть этот PHP-код, который отлично работает. Он сортирует мои данные по фамилии. Проблема заключается в том, что первое имя не сортируется после сортировки фамилии. У кого-нибудь есть мысли? Я запускаю его на php5.

for ($i = 0; $i <= sizeof($post_data['surname']) - 1; $i++) {

  // Create the object to JSON encode
  $arrData = array(
    'surname' => str_replace('"', '\"', str_replace('\\', '\\\\', htmlspecialchars_decode(urldecode($post_data['surname'][$i])))),
    'firstname' => str_replace('"', '\"', str_replace('\\', '\\\\', htmlspecialchars_decode(urldecode($post_data['firstname'][$i])))),
    'lastname' => str_replace('"', '\"', str_replace('\\', '\\\\', htmlspecialchars_decode(urldecode($post_data['lastname'][$i])))),
    'table' => str_replace('"', '\"', str_replace('\\', '\\\\', htmlspecialchars_decode(urldecode($post_data['table'][$i])))),
  );
  $arrDataFull[] = $arrData;
}


usort($arrDataFull, function ($a, $b){
  return strcmp($a["lastname"], $b["lastname"]);
});
  • 0
    if ($a["lastname"] == $b["lastname"]) { return strcmp($a["firstname"], $b["firstname"]); } return strcmp($a["lastname"], $b["lastname"]);
  • 0
    Куда именно приведет это утверждение «если»?
Показать ещё 2 комментария
Теги:
sorting

2 ответа

0

Кажется, вам не хватает ни того, что strcmp делает для вас, ни того, что делает для вас. Strcmp сравнивает две строки, заданные в качестве аргументов, и возвращает ли первый из них перед вторым в алфавитном порядке.

Usort позволяет передавать анонимную функцию, которая будет запущена в вашей коллекции до ее сортировки. Каждая итерация сравнивает два элемента из вашей коллекции, которые вы получаете как аргументы ($ a и $ b). В этой функции вы должны определить, как вы сравниваете эти аргументы.

Поэтому, когда вы сравниваете имя первого лица с фамилией второго лица, вы действительно не получаете то, что хотите.

Вместо этого сначала сравните двух человек по их фамилиям, если их фамилии совпадают, сравните двух человек по их именам.

Таким образом, ваш код будет выглядеть так:

for ($i = 0; $i <= sizeof($post_data['surname']) - 1; $i++) {

  // Create the object to JSON encode
  $arrData = array(
    'surname' => str_replace('"', '\"', str_replace('\\', '\\\\', htmlspecialchars_decode(urldecode($post_data['surname'][$i])))),
    'firstname' => str_replace('"', '\"', str_replace('\\', '\\\\', htmlspecialchars_decode(urldecode($post_data['firstname'][$i])))),
    'lastname' => str_replace('"', '\"', str_replace('\\', '\\\\', htmlspecialchars_decode(urldecode($post_data['lastname'][$i])))),
    'table' => str_replace('"', '\"', str_replace('\\', '\\\\', htmlspecialchars_decode(urldecode($post_data['table'][$i])))),
  );
  $arrDataFull[] = $arrData;
}


usort($arrDataFull, function ($a, $b){
  if($a["lastname"] == $b["lastname"]) {
      return strcmp($a["firstname"], $b["firstname"]);
  }

  return strcmp($a["lastname"], $b["lastname"]);
});
0
$lastnames = array();
$firstnames = array();

for ($i = 0; $i <= sizeof($post_data['surname']) - 1; $i++) {

  // Create the object to JSON encode

  $fname = str_replace('"', '\"', str_replace('\\', '\\\\', htmlspecialchars_decode(urldecode($post_data['firstname'][$i]))));
  $lname = str_replace('"', '\"', str_replace('\\', '\\\\', htmlspecialchars_decode(urldecode($post_data['lastname'][$i]))));
  $arrData = array(
    'surname' => str_replace('"', '\"', str_replace('\\', '\\\\', htmlspecialchars_decode(urldecode($post_data['surname'][$i])))),
    'firstname' => $fname,
    'lastname' => $lname,
    'table' => str_replace('"', '\"', str_replace('\\', '\\\\', htmlspecialchars_decode(urldecode($post_data['table'][$i])))),
  );

  $lastnames[] = $lname;
  $firstnames[] = $fname;

  $arrDataFull[] = $arrData;
}

array_multisort($lastnames, SORT_ASC, $firstnames, SORT_ASC, $arrDataFull);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню