Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка из сложного массива 
:(
    Опции темы
Gold Dragon
Дата 30.8.2006, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Мне необходимо сгруппировать данные из одного большого сложного массива в другой по определённому признаку (Array[$i]['i'])

Вот исходный массив
Код

Array
(
    [0] => Array
        (
            [f] => 37513.80
            [i] => 1
        )
    [1] => Array
        (
            [f] => 75027.7
            [i] => 1
        )
    [2] => Array
        (
            [f] => 112541.5
            [i] => 1
        )
    [3] => Array
        (
            [f] => 150055.4
            [i] => 2
       )
    [4] => Array
        (
            [f] => 187569.2
            [i] => 2
        )
    [5] => Array
        (
            [f] => 225083.1
            [i] => 2
        )
    [6] => Array
        (
            [f] => 262596.9
            [i] => 3
        )
    [7] => Array
        (
            [f] => 300110.8
            [i] => 3
        )
    [8] => Array
        (
            [f] => 337624.6
            [i] => 3
        )
    [9] => Array
        (
            [f] => 375138.5
            [i] => 4
        )
    [10] => Array
        (
            [f] => 412652.3
            [i] => 4
        )
    [11] => Array
        (
            [f] => 450166.2
            [i] => 4
        )
    [12] => Array
        (
            [f] => 487680
            [i] => 5
        )
    [13] => Array
        (
            [f] => 525193.9
            [i] => 5
        )
    [14] => Array
        (
            [f] => 562707.7
            [i] => 5
        )
    [15] => Array
        (
            [f] => 637735.4
            [i] => 6
        )
    [16] => Array
        (
            [f] => 712763.1
            [i] => 6
        )
    [17] => Array
        (
            [f] => 787790.8
            [i] => 7
        )
)


Должно получиться следующее

Код

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [f] => 37513.80
                )
            [1] => Array
                (
                    [f] => 75027.7
                )
            [2] => Array
                (
                    [f] => 112541.5
                )
        )
    [1] => Array
        (
            [0] => Array
                (
                    [f] => 150055.4
                 )
            [1] => Array
                (
                    [f] => 187569.2
                )
            [2] => Array
                (
                    [f] => 225083.1
                )
        )
    [2] => Array
        (
            [0] => Array
                (
                    [f] => 262596.9
                )
            [1] => Array
                (
                    [f] => 300110.8
                )
            [2] => Array
                (
                    [f] => 337624.6
                )
        )
    [3] => Array
        (
            [0] => Array
                (
                    [f] => 375138.5
                )
            [1] => Array
                (
                    [f] => 412652.3
                )
            [2] => Array
                (
                    [f] => 450166.2
                )
        )
    [4] => Array
        (
            [0] => Array
                (
                    [f] => 487680
                )
            [1] => Array
                (
                    [f] => 525193.9
                )
            [2] => Array
                (
                    [f] => 562707.7
                )
        )
    [5] => Array
        (
            [0] => Array
                (
                    [f] => 637735.4
                )
            [1] => Array
                (
                    [f] => 712763.1
                )
        )
    [6] => Array
        (
            [0] => Array
                (
                    [f] => 787790.8
                )
        )
)


Я конечно написал код, но по моему он слишком сложный и хотелось бы его оптимизировать

Вот мой код
Код

    // $fTmp - это исходный массив
    // $temp - новый массив
    $y1 = 0;
    $y2 = 0;
    for ($i=0; $i<count($fTmp); $i++){// $i
        if($i==0){
         $is = $f[$i]['i'];
        }
        if($is==$f[$i]['i']){
         $temp[$y1][$y2]['f'] = $f[$i]['f'];
         $y2++;
        }else{
         $y1++;
         $y2 = 0;
         $temp[$y1][$y2]['f'] = $f[$i]['f'];
         $y2++;
         $is = $f[$i]['i'];
        }
    }



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
faost
Дата 30.8.2006, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 5.11.2004

Репутация: 1
Всего: 2



Интересная задачка =)

Мое решение:

Код

// $a - исходный массив
// $b - результирующий массив

$j = 0;
for ($i = 0; $i < count($a); $i++)
{
    $b[$a[$i]['i'] - 1][]['f'] = $a[$i]['f'];
}


Это сообщение отредактировал(а) faost - 30.8.2006, 12:28
--------------------
Если у вас нет проблем, значит вы уже умерли
PM MAIL   Вверх
G0rinich
Дата 30.8.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.8.2006

Репутация: 1
Всего: 1



Код

<?php
$arr=Array
(
    0 =>  Array('f' => 37513.80, 'i' => 1),
    1 =>  Array('f' => 75027.7,  'i' => 1),
    2 =>  Array('f' => 112541.5, 'i' => 1),
    3 =>  Array('f' => 150055.4, 'i' => 2),
    4 =>  Array('f' => 187569.2, 'i' => 2),
    5 =>  Array('f' => 225083.1, 'i' => 2),
    6 =>  Array('f' => 262596.9, 'i' => 3),
    7 =>  Array('f' => 300110.8, 'i' => 3),
    8 =>  Array('f' => 337624.6, 'i' => 3),
    9 =>  Array('f' => 375138.5, 'i' => 4),
    10 => Array('f' => 412652.3, 'i' => 4),
    11 => Array('f' => 450166.2, 'i' => 4),
    12 => Array('f' => 487680,   'i' => 5),
    13 => Array('f' => 525193.9, 'i' => 5),
    14 => Array('f' => 562707.7, 'i' => 5),
    15 => Array('f' => 637735.4, 'i' => 6),
    16 => Array('f' => 712763.1, 'i' => 6),
    17 => Array('f' => 787790.8, 'i' => 7),
);

$narr=array();

foreach ($arr as $v) $narr[$v['i']][]=$v['f'];

print_r($narr);
?>

PM MAIL   Вверх
faost
Дата 30.8.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 5.11.2004

Репутация: 1
Всего: 2



Цитата(G0rinich @ 30.8.2006,  12:20)
Код


foreach ($arr as $v) $narr[$v['i']][]=$v['f'];

Код

foreach ($arr as $v) 
    $narr[$v['i']][] = array('f' => $v['f']);


Так наверно будет более соответствовать требуемому результату
--------------------
Если у вас нет проблем, значит вы уже умерли
PM MAIL   Вверх
G0rinich
Дата 18.9.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.8.2006

Репутация: 1
Всего: 1



Цитата(faost @  30.8.2006,  12:18 Найти цитируемый пост)
Интересная задачка =)

Мое решение:


Ну вообще-то хреново замаскированное мое ;)
Прям хоть редактирование сообщений выключай.
Это ладно, мне не жалко.
Только вот конструкция 
Цитата(faost @  30.8.2006,  12:18 Найти цитируемый пост)
$b[$a[$i]['i'] - 1][]['f']

вызывает улыбку )))

Жжоте, молодой человек!
PM MAIL   Вверх
Gold Dragon
Дата 18.9.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



faost, G0rinich, спасибо за решение, почти именно то что мне нужно. 

Почему почти? я просто изначально не все условия сказал...  
i - это номер частотного интервала, он используется только для группирования, далее сохратять его не нужно
f - это частота в интервале.

это здесь i получилась подряд, а может быть некоторых интервалов не будет. Например будет 1,2,5,8,12,16. В итоге массив получится не сплошной. То есть мне нужно чтоб он начинался с 0 и дальше попорядку


ЗЫ
я конечно подправил, но вдруг что-то новое и лучшее кто-то напишет smile


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 18.9.2006, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 5
Всего: 360



Код

$output=array();
foreach($input as $arr)
{
output[$arr['i']][]=arr['f'];
}

Цитата(Gold Dragon @  18.9.2006,  17:21 Найти цитируемый пост)
мне нужно чтоб он начинался с 0 и дальше попорядку

А зачем переписывать i, если с foreach ты и так их возьмёшь по порядку в любом месте кода.

ПС:
Если i обязательно упорядочить, то в одим проход не сделаешь (так как неизвестно, какие i вообще могут встречаться) 

Если знаем, что  всегда  следующий i больше предидущего, то целесообразно:
Код

$output=array();
$cnt=0;
$old_i=0;
$first=true;
foreach($input as $arr)
{
if($first){
$old_i=$arr['i']; 
$first=false
}
output[$cnt][]=arr['f'];

if($arr['i'];!=$old_i)
{
$old_i=$arr['i'];
$cnt++;
}
}

Извращения с first можно конечно обойти оператором each. Или array_pop (вроде..)

Добавлено @ 19:41 
Код

$output=array();
$cnt=0;
$first_el=array_shift($input);
$output[0][]=$first_el['f'];
$old_i=$first_el['i'];

foreach($input as $arr)
{
if($arr['i'];!=$old_i)
{
$old_i=$arr['i'];
$cnt++;
}
output[$cnt][]=arr['f'];
}


Вот так покороче будет.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Gold Dragon
Дата 18.9.2006, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(sergejzr @  18.9.2006,  19:36 Найти цитируемый пост)
Если знаем, что  всегда  следующий i больше предидущего, то целесообразно:
всегда.  Но по моему, у тебя код не короче моего получился smile



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ewolf
Дата 18.9.2006, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 15.8.2006
Где: г. Москва

Репутация: 8
Всего: 18



А если попробовать вот так:

Код

usort($old_array, create_function('$a, $b', 'return ($a["i"]==$b["i"])?0:(($a["i"] < $b["i"])?-1:1);'));
 $new_array = array_map(create_function('$n', 'return array("f"=>$n["f"]);'), $old_array);


$old_array - входной массив
$new_array - выходной

PM MAIL ICQ   Вверх
G0rinich
Дата 20.9.2006, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.8.2006

Репутация: 1
Всего: 1



Код

<?php
$arr=Array
(
    0 =>  Array('f' => 37513.80, 'i' => 1),
    1 =>  Array('f' => 75027.7,  'i' => 1),
    2 =>  Array('f' => 112541.5, 'i' => 1),
    3 =>  Array('f' => 150055.4, 'i' => 2),
    4 =>  Array('f' => 187569.2, 'i' => 2),
    5 =>  Array('f' => 225083.1, 'i' => 2),
    6 =>  Array('f' => 262596.9, 'i' => 3),
    7 =>  Array('f' => 300110.8, 'i' => 3),
    8 =>  Array('f' => 337624.6, 'i' => 3),
    9 =>  Array('f' => 375138.5, 'i' => 4),
    10 => Array('f' => 412652.3, 'i' => 4),
    11 => Array('f' => 450166.2, 'i' => 4),
    12 => Array('f' => 487680,   'i' => 5),
    13 => Array('f' => 525193.9, 'i' => 5),
    14 => Array('f' => 562707.7, 'i' => 5),
    15 => Array('f' => 637735.4, 'i' => 6),
    16 => Array('f' => 712763.1, 'i' => 6),
    17 => Array('f' => 787790.8, 'i' => 9),
);

$narr = array();

foreach ($arr as $v) $narr[$v['i']][] = $v['f'];
$narr = array_splice($narr, 0);

print_r($narr);
?> 


Я думаю проще и короче не получится.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4180 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.