Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: отсортировать массив
 
 автор: freeing   (31.01.2010 в 22:50)   письмо автору
 
 

Помогите отсортировать массив:


Array
(
    [0] => 1
    [1] => 1.1
    [2] => 1.2
    [3] => 1.3
    [4] => 1.3.1
    [5] => 1.3.2
    [6] => 1.3.2.1
    [7] => 1.3.2.2
    [8] => 1.3.3
    [9] => 1.3.4
    [10] => 1.3.4.1
    [11] => 1.3.4.2
    [12] => 1.3.4.3
    [13] => 1.3.4.4
    [14] => 1.3.5
    [15] => 1.3.6
    [16] => 1.4
    [17] => 1.5
    [18] => 2
    [19] => 2.1
    [20] => 2.2
    [21] => 2.3
    [22] => 2.3.1
    [23] => 2.3.2
    [24] => 2.3.2.1
    [25] => 2.3.2.2
    [26] => 2.3.3
    [27] => 2.3.4
    [28] => 2.3.4.1
    [29] => 2.3.4.2
    [30] => 2.3.4.3
    [31] => 2.3.4.4
    [32] => 2.3.5
    [33] => 2.3.6
    [34] => 2.4
    [35] => 2.5
)


По типу:


1
    1.1
    1.2
    1.3
        1.3.1
        1.3.2
            1.3.2.1
            1.3.2.2
        1.3.3
        1.3.4
            1.3.4.1
            1.3.4.2
            1.3.4.3
            1.3.4.4
        1.3.5
        1.3.6
    1.4
    1.5
2
    2.1
    2.2
    2.3
        2.3.1
        2.3.2
            2.3.2.1
            2.3.2.2
        2.3.3
        2.3.4
            2.3.4.1
            2.3.4.2
            2.3.4.3
            2.3.4.4
        2.3.5
        2.3.6
    2.4
    2.5


Функции НЕ приветствуются!

  Ответить  
 
 автор: Trianon   (31.01.2010 в 22:55)   письмо автору
 
   для: freeing   (31.01.2010 в 22:50)
 

сортировка массива - это изменение порядка следования его элементов.
У Вас что-то иное.

  Ответить  
 
 автор: freeing   (31.01.2010 в 22:58)   письмо автору
 
   для: Trianon   (31.01.2010 в 22:55)
 

Хорошо - Отсортировать по ID, сути это не меняет

  Ответить  
 
 автор: Trianon   (01.02.2010 в 00:23)   письмо автору
 
   для: freeing   (31.01.2010 в 22:58)
 

Он у Вас отсортирован.
И по ключу, и по значению.

  Ответить  
 
 автор: Саня   (01.02.2010 в 00:31)   письмо автору
 
   для: freeing   (31.01.2010 в 22:50)
 

Это называется не сортировка, а форматированный вывод.
<?
print '<pre>';
foreach ( 
$arr as $a ) {
  print 
str_repeat("\t"substr_count($a'.')).$a."\n";
}

О каких функциях идёт речь?

  Ответить  
 
 автор: freeing   (01.02.2010 в 02:28)   письмо автору
 
   для: Саня   (01.02.2010 в 00:31)
 

Спасибо! Очень хороший пример но я видимо неправильно поставил задачу, мне необходимо из массива сделать многомерный массив, где 1.1 будет элементом 1 – 2.5.7 будет элементом 2.5

То есть:


Array
(
    [1] => Array
    (
        [1.1] =>
        [1.2] =>
        [1.3] => Array
            (
                [1.3.1] =>
                [1.3.2] => Array
                    (
                        [1.3.2.1] =>
                        [1.3.2.2] =>
                    )
                [1.3.3] =>
                [1.3.4] => Array
                    (
                        [1.3.4.1] =>
                        [1.3.4.2] =>
                        [1.3.4.3] =>
                        [1.3.4.4] =>
                    )
                [1.3.5] =>
                [1.3.6] =>
            )
        [1.4] =>
        [1.5] =>
    )
)


Есть такой вариант, но он читает длину строки, поэтому я не могу использовать 1.10, 1.11 – 3.4.55, 5.23.1 – то есть числа выше 9


<?php
    $str 
preg_replace("/\./isU"""$string[1]);

    foreach (
$str as $key => $val)
    {
        
$p = &$array;

        for (
$i 0$i++ < strlen($val);)
        {
            if (!
is_array($p))
            {
                
$p = array();
            }

            
$p = &$p[substr($val0$i)];
        }

        if (!
is_array($p))
        {
            
$p $val;
        }
    }

    
$p = &$array;

    print 
"<pre>";
    
print_r($p);
?>

  Ответить  
 
 автор: Саня   (01.02.2010 в 09:37)   письмо автору
 
   для: freeing   (01.02.2010 в 02:28)
 

В большинстве случаев многомерный массив не нужен. Вы можете обосновать необходимость такого массива?

  Ответить  
 
 автор: freeing   (01.02.2010 в 17:02)   письмо автору
 
   для: Саня   (01.02.2010 в 09:37)
 

суть данного массива, и последующего его перебора, заключается в том что я имею и пытаюсь организовать группу имен и ссылок

есть массив вида:
$id он приведен выше
$nаme содержащий в себе имена страниц
$filе файл для дальнейшей загрузки содержимого страницы

$id который я обрабатываю указывает какая страница к какой относится
то есть, раздел, под раздел

$nаmе указывает какое имя использовать для request, проще говоря это псевдонимы для $id

$file указывает с какого файла с читать данные

и все это с рядом проверок на наличие записи, файлов....

так что уникальные имена вида 1.1, 1.1.1...
это наилучший вариант для распределение разделов и под разделов

  Ответить  
 
 автор: Саня   (01.02.2010 в 17:13)   письмо автору
 
   для: freeing   (01.02.2010 в 17:02)
 

Я так и не понял чем дерево лучше списка в данном конкретном случае.
Если этот массив будет использован для вывода в браузер, то древовидная структура абсолютно не нужна.

  Ответить  
 
 автор: freeing   (01.02.2010 в 17:37)   письмо автору
 
   для: Саня   (01.02.2010 в 17:13)
 

ну вот пример:

есть страница новости
имя страницы /news
файл с описанием 2.8.txt

есть станица новость 1
имя страницы /news/new1
файл с описанием 2.8.1.txt

то есть данный разбор $id необходим чтобы сделать правильный request:

http://test.com/news/
http://test.com/news/new1/
http://test.com/news/new2/

которые в свою очеред читают файлы:

2.8.txt
2.8.1.txt
2.8.2.txt

может я делаю что-то не так, приведи пример со списками если не сложно...

  Ответить  
 
 автор: freeing   (02.02.2010 в 10:20)   письмо автору
 
   для: Саня   (01.02.2010 в 17:13)
 

так что за списки?

  Ответить  
 
 автор: Trianon   (01.02.2010 в 10:18)   письмо автору
 
   для: freeing   (01.02.2010 в 02:28)
 

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

  Ответить  
 
 автор: freeing   (01.02.2010 в 17:39)   письмо автору
 
   для: Trianon   (01.02.2010 в 10:18)
 

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

  Ответить  
 
 автор: Trianon   (02.02.2010 в 12:15)   письмо автору
 
   для: freeing   (01.02.2010 в 17:39)
 

функции обратного вызова я применять не предлагал.
Про "усложняет работу программы" уместно говорить, сравнивая уже работающие (или хотя бы работоспособные) варианты. У Вас есть с чем сравнивать?
Или Вы про "усложняет работу программиста"?

  Ответить  
 
 автор: freeing   (02.02.2010 в 14:44)   письмо автору
 
   для: Trianon   (02.02.2010 в 12:15)
 

Решение!


<?php
    $string 
= array
    (
        
"1",
        
"1.1",
        
"1.2",
        
"1.3",
        
"1.3.1",
        
"1.3.2",
        
"1.3.2.1",
        
"1.3.2.2",
        
"1.3.3",
        
"1.3.4",
        
"1.3.4.1",
        
"1.3.4.2",
        
"1.3.4.3",
        
"1.3.4.4",
        
"1.3.5",
        
"1.3.6",
        
"1.4",
        
"1.5",
        
"2",
        
"2.1",
        
"2.2",
        
"2.3",
        
"2.3.1",
        
"2.3.2",
        
"2.3.2.1",
        
"2.3.2.2",
        
"2.3.3",
        
"2.3.4",
        
"2.3.4.1",
        
"2.3.4.2",
        
"2.3.4.3",
        
"2.3.4.4",
        
"2.3.5",
        
"2.3.6",
        
"2.4",
        
"2.5",
    );


    foreach (
$string as $key => $val)
    {
        
$p = &$array;
    
        
$i 0;
    
        while(
$i strpos($val.'.','.',$i 1))
        {
            if (!
is_array($p))
            {
                
$p = array();
            }
    
            
$p = &$p[substr($val0$i)];
        }
    
        if (!
is_array($p))
        {
            
$p $val;
        }
    }

    
$p = &$array;

    print 
"<pre>";
    
print_r($p);
?>

  Ответить  
 
 автор: Trianon   (02.02.2010 в 15:59)   письмо автору
 
   для: freeing   (02.02.2010 в 14:44)
 

Это не решение. Неопределенные переменные в коде.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования