[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Перебор двух массивов
ArtemKrass
Всем Добрый день!

Имеется код:

foreach ($city as $city1)
{
// По id города узнаем id острова
$towninfo = 'http://ru1.grepolis.com/game/town_info?action=info&town_id='.$city1['id'].'&h='.$token[1].'&json={"id":"'.$city1['id'].'","town_id":'.$city1['id'].',"nlreq_id":'.$nlreq[1].'}&_='.$timef;
curl_setopt($curl, CURLOPT_URL, $towninfo);
curl_setopt($curl, CURLOPT_REFERER, 'http://ru1.grepolis.com/game/index?login=1');
curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-REQUESTED-WITH: XMLHttpRequest'));
curl_setopt($curl, CURLOPT_POST, false);
$html = curl_exec($curl);
//echo ($html);
preg_match('#class="gp_island_link">.*\s(\d+)<\/a>#', $html, $island);
// id острова $island[1];
//print_r ($island);

echo 'CityID'.$city1['id'].' - '.'IslandID'.$island[1].'</br>';
}


Имеется определенное количество городов ($city['id']), каждый город находится на определенном острове ($island[1]), но случается так, что на одном острове может быть несколько городов...

Задача в том, чтобы выбрать из тех городов, которые находятся на одном острове, один, с наименьшим кол-вом ресурсов...

Не могу сообразить как это осуществить... Нужно склеить массивы или ???

Вот что на выходе:

CityID: 57664 - IslandID: 1146207
CityID: 81453 - IslandID: 1146207
CityID: 50380 - IslandID: 1146207
CityID: 50278 - IslandID: 1146207
CityID: 80290 - IslandID: 1146207
CityID: 78218 - IslandID: 1146247
CityID: 46826 - IslandID: 1146165
CityID: 80121 - IslandID: 1143914
CityID: 73254 - IslandID: 1146241
CityID: 55584 - IslandID: 1143814
CityID: 74000 - IslandID: 1146241
CityID: 75350 - IslandID: 1146165
CityID: 54128 - IslandID: 1146194




Спустя 2 часа, 32 минуты, 11 секунд (26.07.2012 - 12:11) kovaldm написал(а):
А где количество ресурсов увидеть?

Спустя 59 минут, 3 секунды (26.07.2012 - 13:10) ArtemKrass написал(а):
Сейчас буду парсить. Мне не понятен сам принцип сравнения значений элементов массива, т.е. как при переборе массива собрать города, расположенные на одном острове...

Спустя 26 минут, 24 секунды (26.07.2012 - 13:37) ArtemKrass написал(а):
Спарсил сумму ресурсов, теперь код такой:

foreach ($city as $city1)
{
// По id города узнаем id острова
$towninfo = 'http://ru1.grepolis.com/game/town_info?action=info&town_id='.$city1['id'].'&h='.$token[1].'&json={"id":"'.$city1['id'].'","town_id":'.$city1['id'].',"nlreq_id":'.$nlreq[1].'}&_='.$timef;
curl_setopt($curl, CURLOPT_URL, $towninfo);
curl_setopt($curl, CURLOPT_REFERER, 'http://ru1.grepolis.com/game/index?login=1');
curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-REQUESTED-WITH: XMLHttpRequest'));
curl_setopt($curl, CURLOPT_POST, false);
$html = curl_exec($curl);
//echo ($html);
preg_match('#class="gp_island_link">.*\s(\d+)<\/a>#', $html, $island);

// По id грода узнаем кол-во ресурсов и суммируем его
$resourceinfourl = 'http://ru1.grepolis.com/game/index?action=switch_town&town_id='.$city1['id'].'&h='.$token[1].'&json={"town_id":"'.$city1['id'].'","nlreq_id":'.$nlreq[1].'}&_='.$timef;
curl_setopt($curl, CURLOPT_URL, $resourceinfourl);
curl_setopt($curl, CURLOPT_REFERER, 'http://ru1.grepolis.com/game/index?login=1');
curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-REQUESTED-WITH: XMLHttpRequest'));
curl_setopt($curl, CURLOPT_POST, false);
$htmlres = curl_exec($curl);
//echo ($htmlres);
preg_match ('#"resources":(.*?),"storage#', $htmlres, $res);
$res = json_decode($res[1], true);
$sumres = array_sum ($res);
//print_r ($sumres);

echo 'CityID: '.$city1['id'].' - '.'IslandID: '.$island[1].' - '.'SumResource: '.$sumres.'</br>';
}


На выходе получаю:

CityID: 57664 - IslandID: 1146207 - SumResource: 65068
CityID: 81453 - IslandID: 1146207 - SumResource: 65060
CityID: 50380 - IslandID: 1146207 - SumResource: 54045
CityID: 50278 - IslandID: 1146207 - SumResource: 65558
CityID: 80290 - IslandID: 1146207 - SumResource: 65822
CityID: 78218 - IslandID: 1146247 - SumResource: 64935
CityID: 46826 - IslandID: 1146165 - SumResource: 66131
CityID: 80121 - IslandID: 1143914 - SumResource: 57208
CityID: 73254 - IslandID: 1146241 - SumResource: 53561
CityID: 55584 - IslandID: 1143814 - SumResource: 52142
CityID: 74000 - IslandID: 1146241 - SumResource: 44035
CityID: 75350 - IslandID: 1146165 - SumResource: 60809
CityID: 54128 - IslandID: 1146194 - SumResource: 64693


Т.е. я имею три массива
1 - масиив с id городов
2 - массив с id островов
3. - массив с суммами ресурсов

Мне нужно выбрать все города, но с таким условием, что если на одном острове имеется несколько городов из них оставить только тот, у которого сумма ресурсов меньше чем у остальных городов на этом острове...

Спустя 31 минута, 33 секунды (26.07.2012 - 14:08) ArtemKrass написал(а):
Слил массивы и получил:

Array
(
[0] => Array
(
[cityID] => 57664
[islandID] => 1146207
[SumRess] => 66413
)

[1] => Array
(
[cityID] => 81453
[islandID] => 1146207
[SumRess] => 66406
)

[2] => Array
(
[cityID] => 50380
[islandID] => 1146207
[SumRess] => 54843
)

[3] => Array
(
[cityID] => 50278
[islandID] => 1146207
[SumRess] => 66456
)

[4] => Array
(
[cityID] => 80290
[islandID] => 1146207
[SumRess] => 66720
)

[5] => Array
(
[cityID] => 78218
[islandID] => 1146247
[SumRess] => 65952
)

[6] => Array
(
[cityID] => 46826
[islandID] => 1146165
[SumRess] => 66482
)

[7] => Array
(
[cityID] => 80121
[islandID] => 1143914
[SumRess] => 58224
)

[8] => Array
(
[cityID] => 73254
[islandID] => 1146241
[SumRess] => 54361
)

[9] => Array
(
[cityID] => 55584
[islandID] => 1143814
[SumRess] => 10423
)

[10] => Array
(
[cityID] => 74000
[islandID] => 1146241
[SumRess] => 45380
)

[11] => Array
(
[cityID] => 75350
[islandID] => 1146165
[SumRess] => 61706
)

[12] => Array
(
[cityID] => 54128
[islandID] => 1146194
[SumRess] => 65807
)

)


Как теперь решить мою задачу?

Спустя 13 минут, 23 секунды (26.07.2012 - 14:22) inpost написал(а):
прогани этот массив форэчем, в кажной инерции сравнивай его с самим собой через еще один форэч. Дубли лишние убирай через унсет

Спустя 17 минут, 59 секунд (26.07.2012 - 14:40) ArtemKrass написал(а):
я так и думал... пробовал прогонять по разному, но толковый результат так и не получил...

Спустя 3 часа, 11 минут, 43 секунды (26.07.2012 - 17:51) ArtemKrass написал(а):
Чёт у меня так и не получается, помогите...

Спустя 2 часа, 22 минуты, 59 секунд (26.07.2012 - 20:14) kovaldm написал(а):
Как-то так...
Свернутый текст

function returnMaxElement($v)
{
return array(array_search(max($v), $v) => max($v));
}

$data = Array
(
0 => Array
(
'cityID' => 57664,
'islandID' => 1146207,
'SumRess' => 66413,
),


1 => Array
(
'cityID' => 81453,
'islandID' => 1146207,
'SumRess' => 66406,
),


2 => Array
(
'cityID' => 50380,
'islandID' => 1146207,
'SumRess' => 54843,
),


3 => Array
(
'cityID' => 50278,
'islandID' => 1146207,
'SumRess' => 66456,
),


4 => Array
(
'cityID' => 80290,
'islandID' => 1146207,
'SumRess' => 66720,
),


5 => Array
(
'cityID' => 78218,
'islandID' => 1146247,
'SumRess' => 65952,
),


6 => Array
(
'cityID' => 46826,
'islandID' => 1146165,
'SumRess' => 66482,
),


7 => Array
(
'cityID' => 80121,
'islandID' => 1143914,
'SumRess' => 58224,
),


8 => Array
(
'cityID' => 73254,
'islandID' => 1146241,
'SumRess' => 54361,
),


9 => Array
(
'cityID' => 55584,
'islandID' => 1143814,
'SumRess' => 10423,
),


10 => Array
(
'cityID' => 74000,
'islandID' => 1146241,
'SumRess' => 45380,
),


11 => Array
(
'cityID' => 75350,
'islandID' => 1146165,
'SumRess' => 61706,
),


12 => Array
(
'cityID' => 54128,
'islandID' => 1146194,
'SumRess' => 65807,
),
);


$newData = array();

foreach($data as $d)
{
$newData[$d['islandID']][$d['cityID']] = $d['SumRess'];
}

$newData = array_map('returnMaxElement', $newData);
Получишь массив $newData[islandID][cityID] = SumRess

Спустя 17 минут, 9 секунд (26.07.2012 - 20:31) ArtemKrass написал(а):
Во блин, рабботает! Только max на min заменил... Теперь мне надо все это осмыслить... + в карму поставил! СПАСИБО!!!

Спустя 13 часов, 51 минута, 1 секунда (27.07.2012 - 10:22) ArtemKrass написал(а):
Не получается до конца разобраться... Эти функции обратного вызова до меня не доходят, мало опыта!


Все правильно работает, но мне нужен массив немного другого вида

Я на выходе получаю:

Array
(
[1146207] => Array
(
[80290] => 66720
)

[1146247] => Array
(
[78218] => 65952
)

[1146165] => Array
(
[46826] => 66482
)

[1143914] => Array
(
[80121] => 58224
)

[1146241] => Array
(
[73254] => 54361
)

[1143814] => Array
(
[55584] => 10423
)

[1146194] => Array
(
[54128] => 65807
)

)


А мне бы надо примерно так:


Array
(
[0] => Array
(
[cityID] => 80290
[islandID] => 1146207
[SumRess] => 66720
)

[1] => Array
(
[cityID] => 78218
[islandID] => 1146247
[SumRess] => 65952
)
.............
.............
.............


Или это невозможно?

Спустя 10 часов, 10 минут, 13 секунд (27.07.2012 - 20:33) kovaldm написал(а):
Самое простое
Свернутый текст

<?php
$data = Array
(
0 => Array
(
'cityID' => 57664,
'islandID' => 1146207,
'SumRess' => 66413,
),


1 => Array
(
'cityID' => 81453,
'islandID' => 1146207,
'SumRess' => 66406,
),


2 => Array
(
'cityID' => 50380,
'islandID' => 1146207,
'SumRess' => 54843,
),


3 => Array
(
'cityID' => 50278,
'islandID' => 1146207,
'SumRess' => 66456,
),


4 => Array
(
'cityID' => 80290,
'islandID' => 1146207,
'SumRess' => 66720,
),


5 => Array
(
'cityID' => 78218,
'islandID' => 1146247,
'SumRess' => 65952,
),


6 => Array
(
'cityID' => 46826,
'islandID' => 1146165,
'SumRess' => 66482,
),


7 => Array
(
'cityID' => 80121,
'islandID' => 1143914,
'SumRess' => 58224,
),


8 => Array
(
'cityID' => 73254,
'islandID' => 1146241,
'SumRess' => 54361,
),


9 => Array
(
'cityID' => 55584,
'islandID' => 1143814,
'SumRess' => 10423,
),


10 => Array
(
'cityID' => 74000,
'islandID' => 1146241,
'SumRess' => 45380,
),


11 => Array
(
'cityID' => 75350,
'islandID' => 1146165,
'SumRess' => 61706,
),


12 => Array
(
'cityID' => 54128,
'islandID' => 1146194,
'SumRess' => 65807,
),
);


$newData = array();

foreach($data as $d)
{
$newData[$d['islandID']][$d['cityID']] = $d['SumRess'];
}

function returnMaxElement($v)
{
return array(
'cityID'=>array_search(max($v), $v),
'SumRess'=>max($v),
);

}
//print_r($newData);
$newData = array_map('returnMaxElement', $newData);

foreach($newData as $k=>&$v)
$v['islandID'] = $k;

$newData = array_values($newData);

print_r($newData);
?>

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.