#php #arrays #sorting
#php #массивы #сортировка
Вопрос:
До сих пор мне удавалось преобразовать строку в массив в php и вывести ее с помощью оператора foreach и echo. Но когда я пытаюсь отсортировать ее, я получаю такую ошибку:
Предупреждение: asort() ожидает, что параметр 1 будет массивом.
В учебнике, который я изучаю, показан пример, подобный этому:
sort($array[,$compare]).
Я не совсем понимаю это. Я не хочу использовать эту print_r
функцию. Я просто хочу повторить результат, поэтому я пришел сюда, чтобы попросить о помощи. Я ценю любые советы. Вот мой код:
<form action="list.php" method="post">
<input type="text" name="names">
<br>
<input type="submit" value="Submit">
<?php
if(!isset($name)) {$name = '';}
if(!isset($names)) {$names = '';}
if(!isset($value)) {$value = '';}
if(!isset($myarray)) {$myarray = '';}
$name = filter_input(INPUT_POST, 'name');
$names = filter_input(INPUT_POST, 'names');
$myarray = filter_input(INPUT_POST, 'myarray');
if($myarray === NULL){
$myarray = array();
}
$myarray = $names;
$name = explode(' ', $myarray);
foreach($name as $value){
echo ($value)."<br>";
}
$myarray = $names;
$name = explode(' ', $myarray);
foreach($name as $value){
echo asort($value)."<br>";
}
$myarray = $names;
$name = explode(' ', $myarray);
foreach($name as $value){
echo arsort($value)."<br>";
}
?>
Комментарии:
1. Вам нужен
asort()
массив, а не значения (элементы массивов)!
Ответ №1:
Во-первых, здесь ничего не нужно делать $name
:
$name = filter_input(INPUT_POST, 'name');
Также не нужно ничего делать с $myarray
here:
$myarray = filter_input(INPUT_POST, 'myarray');
Или здесь:
if($myarray === NULL){
$myarray = array();
}
Поскольку вы перезаписываете все, что может быть в нем здесь:
$myarray = $names;
И здесь вы перезаписываете $name
:
$name = explode(' ', $myarray);
Это тоже не нужно делать, $myarray
не изменилось с момента получения этого значения в последний раз:
$myarray = $names;
Сортировка должна выполняться по массиву, а не по значениям, и sort()
, вероятно, это то, что вы хотите здесь:
$name = asort($myarray);
foreach ($name as $value){
echo "$value<br>";
}
А затем обратная сортировка:
$myarray = $names;
$name = arsort(explode(' ', $myarray));
foreach ($name as $value){
echo "$value<br>";
}
Итак, для полного кода, несколько упрощенного и сокращенного:
<form action="list.php" method="post">
<input type="text" name="names">
<br>
<input type="submit" value="Submit">
<?php
// This is the only variable you are posting
// Also doing explode here
$names = explode(' ', filter_input(INPUT_POST, 'names'));
// Store a copy of the array here so that we have the original unchanged
$myarray = $names;
// Printing out the array as is
foreach ($myarray as $value)
{
// Double quotes to parse variables
echo "$value<br>";
}
// Sort the array
sort($myarray);
// Print it out sorted
foreach ($myarray as $value)
{
echo "$value<br>";
}
// Reverse the array
arsort($myarray);
// Print out again
foreach ($myarray as $value)
{
echo "$value<br>";
}
?>
Комментарии:
1. Я был слишком поспешен, чтобы опубликовать свой последний комментарий, прежде чем я изучил свои варианты. Это были мои опечатки, которые вызывали ошибки. Предложенный вами код работает, и он ОТЛИЧНО работает! Спасибо.
Ответ №2:
Вы должны выполнить сортировку перед циклом. Т.е.
asort($name);
foreach($name as $value){
echo $value."<br>";
}
$myarray = $names;
$name = explode(' ', $myarray);
arsort($name);
foreach($name as $value){
echo $value."<br>";
}
Комментарии:
1. Я так рад, что опубликовал эту проблему, и я надеюсь, что кто-нибудь еще, кто борется с php, может увидеть это и получить помощь.