Имеется код:
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 написал(а):
Спарсил сумму ресурсов, теперь код такой:
На выходе получаю:
Т.е. я имею три массива
1 - масиив с id городов
2 - массив с id островов
3. - массив с суммами ресурсов
Мне нужно выбрать все города, но с таким условием, что если на одном острове имеется несколько городов из них оставить только тот, у которого сумма ресурсов меньше чем у остальных городов на этом острове...
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 написал(а):
Как-то так...
Получишь массив $newData[islandID][cityID] = SumRess
Свернутый текст
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);
Спустя 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);
?>