Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
20 / 19 / 3
Регистрация: 20.06.2010
Сообщений: 626

Сортировка нескольких массивов

03.08.2011, 01:51. Показов 2110. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В цикле создается несколько массивов.

PHP
1
2
3
4
5
6
7
8
9
10
for ($i=0; $i<16; $i++)
{
....
$c1 = 121;
$c2 = 2323;
$c3 = dfa;
$c4 = rtt34;
 
$unit["$i"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
}
потом эти все массивы нужно вывести в одной таблице.

Только есть одна проблема, нужно что таблица была отсортирована по одному из параметров, например "name" или "idp". В общем нужен ORDER BY по всем массивам.
Как это можно сделать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.08.2011, 01:51
Ответы с готовыми решениями:

программы усложненной структуры, обработка двухмерных массивов, использование стандартных функций для работы с массивами, сортировка массивов.
Искала задачи, нашла в с++, а нужно в паскале сотворить следующее. Использование стандартных функций для работы с массивами. ...

Обработка одномерных массивов. Сортировка массивов
Здравствуйсте! Помогите пожалуйста написать программу! В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1)...

Вывод элементов массивов, сортировка массивов
вот ссылки program 1аЬ4; uses crt; const е=0.0010; d=l.Зе-7; var a, b, г, s, х, fa, fг, n, с : real; begin write('введите айв:...

13
 Аватар для F(r)an!k
31 / 31 / 4
Регистрация: 12.03.2010
Сообщений: 185
03.08.2011, 06:05
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
$pattern = 'abcdefghijklmnopqrstuvwxyz';
 
for ($i=0; $i<16; $i++){
    $c1 = rand(0, 16);
    $c2 = rand(0, 999);
    $c3 = $pattern[rand(0, strlen($pattern)-1)];
    $c4 = $pattern[rand(0, strlen($pattern)-1)];
    
    $unit[$i] = array ("poz" => $c1, "idp" => $c2, "name" => $c3, "idc" => $c4);
}
 
$sort = 'idp'; // ключ сортировки
 
for($j=0; $j<count($unit)-1; $j++){
    for($i=0; $i<count($unit)-1; $i++){
        $current = $unit[$i][$sort];
        $next = $unit[$i+1][$sort];
        if($current > $next){
            $temp = $unit[$i];
            $unit[$i] = $unit[$i+1];
            $unit[$i+1] = $temp;
        }
    }
}
 
foreach($unit as $key=>$val){
    $out .= '<tr>';
    foreach($val as $sub_key => $sub_val){
        $out .= '<td>'.$sub_val.'</td>';
    }
    $out .= '</tr>';
}
    
foreach($unit[0] as $key => $val){
    if($key == $sort){$style = 'style="color:red"';}
    $headers .= '<td '.$style.'>'.$key.'</td>';
    $style = null;
}
 
$tab = '<table border=1><tr>'.$headers.'</tr>'.$out.'</table>';
 
print($tab);
0
210 / 204 / 52
Регистрация: 25.07.2010
Сообщений: 1,162
03.08.2011, 14:32
делается всё в одну строчку

PHP
1
ksort($unit[]["idp"]);
1
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
03.08.2011, 16:02
borovik, не получается

Добавлено через 2 минуты
как вариант, вот
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Оставляем здесь, как есть
$text = 'abcdefghijklmnopqrstuvwxyz';
    
for ($i = 0; $i <= 16; $i++)
{
    $c1 = rand(0, 20);
    $c2 = rand(0, 100);
        
    $c3 = $text[rand(0, strlen($text) - 1)];
    $c4 = $text[rand(0, strlen($text) - 1)];
        
    // превращаем исходный массив в двумерный (в первом ряду идет параметр, по которому будем сортировать)
    $unit[$i] = array(
        'param' => $c2,
        'name' => array('poz' => $c1, 'idp' => $c2, 'name' => $c3, 'idc' => $c4)
        );
}
// ловим параметр сортировки и сортируем
foreach ($unit as $k => $v)
{
    // вытаскиваем уровень, в котором надо искать
    $name[$k] = $v['name'];
    // вот наш параметр (его можно менять)
    $idp[$k] = $v['idp'];
}
// говорят, что эта ф-я не надежная ...
// SORT_ASC - можно менять, на что - читать мануал
array_multisort($idp, SORT_ASC, $unit);
    
/*
    echo '<pre>';
    print_r($unit);
    echo '</pre>';
*/
// Строим таблицу
$out = "";
$out .= "<table style='border: 1px solid #cc0000; text-align: center; background: #f9f9f9;'>
        <tr>
           <th>poz</th>
           <th>idp</th>
           <th>name</th>
           <th>idc</th>
        </tr>
        ";
// цикл по отсортированному массиву (как-бы по кол-ву элементов, у нас 16)
foreach ($unit as $keys => $value)
{
    // входим в каждый элемент
    foreach ($value as $key => $val)
    {
    $out .= "<tr style='border: 1px solid #cc0000;'>";
    // отбрасываем не массивную часть 2-мерного массива - 'param' => $c2,
    if (is_array($val)) 
            foreach ($val as $k => $v)
            $out .= "<td style='border: 1px dotted #cc0000; width: 50px;'>$v</td>";
    }
}
$out .= "</table>";
    
// Вывод
echo $out;
0
20 / 19 / 3
Регистрация: 20.06.2010
Сообщений: 626
03.08.2011, 17:02  [ТС]
Ничего не понял. ((((

На таблицу время не тратьте я её и сам могу построить, можно просто
echo $unit[$i]["idc"];
проблема только в сортировке массивов.

И сортировать не параметры внутри массива а сами массивы в зависимости от содержащегося параметра. В данном случае у меня это числа от - до + нужно отсортировать от большего к меньшему.
Можно было бы вписать в mysql и там отсортировать и потом вывести но это на крайний случай.


$unit["1"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["2"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["3"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["4"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
...
$unit["12"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");

ORDER BY "idc" DESC
0
210 / 204 / 52
Регистрация: 25.07.2010
Сообщений: 1,162
03.08.2011, 17:26
ICEBERG@,


как я понял
$unit["2"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["4"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["1"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["3"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
PHP
1
ksort($unit);
$unit["1"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["2"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["3"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["4"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
0
20 / 19 / 3
Регистрация: 20.06.2010
Сообщений: 626
03.08.2011, 17:35  [ТС]
PHP
1
2
3
4
// Многомерный массив
$A["Ivanov"] = array("name"=>"Иванов И.И.", "age"=>"47", "email"=>"ivanov@mail.ru");
$A["Petrov"] = array("name"=>"Петров П.П.", "age"=>"28", "email"=>"petrov@mail.ru");
$A["Sidorov"] = array("name"=>"Сидоров С.С.", "age"=>"34", "email"=>"sidorov@mail.ru");
К примеру нужно распечатать это отсортировав во возрасту. Можно просто без таблицы.

Добавлено через 6 минут
Цитата Сообщение от borovik Посмотреть сообщение
ICEBERG@,


как я понял
$unit["2"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["4"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["1"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["3"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
PHP
1
ksort($unit);
$unit["1"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["2"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["3"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
$unit["4"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "$c4");
Нет там все в порядке.

Обратите внимание на параметр "idc" :
PHP
1
2
3
4
$unit["1"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "-0,540");
$unit["2"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "2,563");
$unit["3"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "15,004");
$unit["4"] = array ("poz" => "$c1", "idp" => "$c2", "name" => "$c3", "idc" => "7,251");
следовательно нужно распечатывать в таком порядке :
$unit["3"], $unit["4"], $unit["2"], $unit["1"]

от большего "idc" к меньшему.
0
210 / 204 / 52
Регистрация: 25.07.2010
Сообщений: 1,162
03.08.2011, 22:26
вот рабочий результат

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
echo "<pre>";
print_r($unit);
echo "</pre>";
 
function cmp_pc($a, $b)
{
     return ((int)$a["idc"] > (int)$b["idc"])?1:-1;
}
uasort($unit, "cmp_pc");
 
echo "<pre>";
print_r($unit);
echo "</pre>";
как я и говорил всё делается одной строчкой
0
20 / 19 / 3
Регистрация: 20.06.2010
Сообщений: 626
04.08.2011, 13:49  [ТС]
Вчера нашел аналогичный пример.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?PHP
function compare($v1, $v2)
{
   if ($v1['prio'] == v2['prio']) return 0;
   return ($v1['prio'] < $v2['prio'])?-1:1;
}
 
$arr = array(
  1 => array ( 'name' => 'mas1', 'prio' => '100'),
  2 => array ( 'name' => 'mas2', 'prio' => '130'),
  3 => array ( 'name' => 'mas3', 'prio' => '70'),
  4 => array ( 'name' => 'mas4', 'prio' => '101'),
  5 => array ( 'name' => 'mas5', 'prio' => '80'),
  6 => array ( 'name' => 'mas6', 'prio' => '20'),
  7 => array ( 'name' => 'mas7', 'prio' => '150')
);
usort($arr, 'compare');
?>
Не совсем в одну строку но работает.
0
210 / 204 / 52
Регистрация: 25.07.2010
Сообщений: 1,162
04.08.2011, 15:29
ICEBERG@, этот код неправильный если будет
21
191
11
то он выдаст так
11
191
21
-------
так что мой код правильней и он в "одну строку"
0
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
04.08.2011, 16:16
Цитата Сообщение от ICEBERG@ Посмотреть сообщение
Ничего не понял. ((((
что не понятно? код же рабочий
Цитата Сообщение от ICEBERG@ Посмотреть сообщение
И сортировать не параметры внутри массива а сами массивы в зависимости от содержащегося параметра. В данном случае у меня это числа от - до + нужно отсортировать от большего к меньшему.
Он так и делает, тока чтобы от большего к меньшему поставь SORT_DESC вместо SORT_ASC.
Еще можно сортировать так (взято с php.su)
Code
1
2
3
4
Sorting type flags:
    SORT_REGULAR - сравнивать элементы обычным образом
    SORT_NUMERIC - сравнивать элементы, как если бы они были числами
    SORT_STRING - сравнивать элементы, как если бы они были строками
Добавлено через 2 минуты
Основной смысл скрипта вынести параметр сортировки как отдельный элемент в массиве

Добавлено через 4 минуты
правда у borovik, короче получается
borovik, не совсем пойму принцип работы твоей ф-ии. объясни пожалуйста.
0
210 / 204 / 52
Регистрация: 25.07.2010
Сообщений: 1,162
04.08.2011, 20:09
Love_and_Peace,
тут не нужно управлять процессом или строить логику, тут нужно указать как сравнивать две сущности ну и X > X возращается 1 тоесть чтото меняется, X < X то ретурн -1 значит тут всё впорядке и начать следующий шаг
ну а так http://php.su/functions/?uasort

ещё разок кто не понял о чём речь
PHP
1
2
3
4
5
function cmp_pc($a, $b)
{
     return ((int)$a["idc"] > (int)$b["idc"])?1:-1;
}
uasort($unit, "cmp_pc");
1
20 / 19 / 3
Регистрация: 20.06.2010
Сообщений: 626
06.08.2011, 00:04  [ТС]
Цитата Сообщение от borovik Посмотреть сообщение
ICEBERG@, этот код неправильный если будет
21
191
11
то он выдаст так
11
191
21
-------
так что мой код правильней и он в "одну строку"
Вроде без ошибок работает.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function compare($v1, $v2)
{
   if ($v1['prio'] == $v2['prio']) 
   {return 0;}
   return ($v1['prio'] < $v2['prio'])?-1:1;
}
 
$arr = array(
  1 => array ( 'name' => 'mas1', 'prio' => '005'),
  2 => array ( 'name' => 'mas2', 'prio' => '-4,6'),
  3 => array ( 'name' => 'mas3', 'prio' => '21'),
  4 => array ( 'name' => 'mas4', 'prio' => '1'),
  5 => array ( 'name' => 'mas5', 'prio' => '111'),
  6 => array ( 'name' => 'mas6', 'prio' => '11'),
  7 => array ( 'name' => 'mas7', 'prio' => '0,54')
 
);
usort($arr, 'compare');
 
 
for ($i = 0; $i < 10; $i++)
{
echo $arr[$i]['prio']."<br>";
}
На выходе дает
-4,6
0,54
1
005
11
21
111
0
210 / 204 / 52
Регистрация: 25.07.2010
Сообщений: 1,162
06.08.2011, 10:45
ICEBERG@, страно у меня твой код сравнивает как стринг.
получается
-4,6
0,54
005
1
11
111
21
лучше использовать преобразование типов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.08.2011, 10:45
Помогаю со студенческими работами здесь

Обработка одномерных массивов. Сортировка массивов
Здравствуйте, помогите пожалуйста решить задачу легким способом. В одномерном массиве, состоящем из n вещественных элементов, вычислить: ...

Сортировка массивов по убыванию и замена массивов
Задача: Даны два массива: А3 и В3х3. Массив А упорядочить по убыванию и заменить им первую строку матрицы В. Где-то раньше у вас был...

Массивы. Обьявление массивов. Сортировка массивов
Массивы. Массивы, друзья мои, очень простая и крайне необходимая штука. Простой пример: ты считал из директории 50 имен файлов и...

Сортировка массивов (Сортировка слов по алфавиту)
Объясните мне сортировку слов по алфавиту .Сравнивать целиком слова нельзя ?Есть ли какой нибудь быстрый способ?Какие то полезные функции...

Сравнение нескольких массивов
Здравствуйте! Помогите с выполнением такой задачи: на вход поступает несколько файлов (минимум 2), затем каждый из них заносится в массив,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru