|
|
|
| Здравствуйте, у меня похожая ситуация, но подобным способом решить её что-то не получаеться:(((
Есть 2 массива, массив1 может состоять максимум из 100 строк, массив 2, содержит сотни строк. Нужно каждую сторочку $massiv1[$f][0].$massiv1[$f][1] проверить на совподения с $massiv2[$i][0].$massiv2[$i][1], и вывести $massiv2[$i][2] - вроде бы мне это удалось, но теперь я не знаю как рассортировать по массивам разные марки машин, чтоб можно было по отдельности вычеслить среднюю стоимость каждой, которая была в массиве1
<?php
$massiv1=array(
array("2001", "Toyota Ist", "304000"),
array("2002", "Honda Odyssey", "354000"),
);
$massiv2=array(
array("2001", "Toyota Ist", "300000"),
array("2001", "Toyota Ist", "304000"),
array("2001", "Toyota Ist", "310000"),
array("2000", "Toyota Duet", "210000"),
array("2000", "Toyota Duet", "20000"),
array("2007", "Toyota Camry", "660000"),
array("2007", "Toyota Camry", "690000"),
array("2002", "Chevrolet Lanos", "250000"),
array("2002", "Chevrolet Lanos", "220000"),
array("2002", "Honda Odyssey", "354000"),
array("2002", "Honda Odyssey", "330000"),
array("2001", "LADA (ÂÀÇ) 2110", "280000"),
array("2001", "LADA (ÂÀÇ) 2110", "220000"),
);
for ($f=0; $f<count($massiv1); $f++) {
for ($i=0; $i<count($massiv2); $i++) {
if($massiv1[$f][0].$massiv1[$f][1]==$massiv2[$i][0].$massiv2[$i][1])
{
print $massiv2[$i][0].$massiv2[$i][1].$massiv2[$i][2]."<br>";
}
}
}
?>
|
В итоге нужно получить
$massiv1=array(
array("2001", "Toyota Ist", "304000"),
array("2002", "Honda Odyssey", "354000"),
);
//и возможно это будет треттий массив
$massiv3=array(
array("2001", "Toyota Ist", "средняя цена"),
array("2002", "Honda Odyssey", "средняя цена"),
);
|
| |
|
|
|
|
|
|
|
для: polopok
(10.02.2011 в 07:44)
| | У вас совсем иная ситуация. Вам конечным результатом ведь надо узнать среднюю стоимость неких авто? | |
|
|
|
|
|
|
|
для: sim5
(10.02.2011 в 07:59)
| | Да, нужно как то разделить совпадающие марки из массима2 чтоб поотдельности узнать среднюю стоимость, а так получаеться что он просто будет складывать все цены, не зависимо от марок. | |
|
|
|
|
|
|
|
для: polopok
(10.02.2011 в 08:09)
| | Первый массив для чего служит? | |
|
|
|
|
|
|
|
для: sim5
(10.02.2011 в 08:35)
| | первый массив задаёт конкрентые мошины которые нужно проверить по базе тоесть массив1, на предмет есть ли в массиве1 машины стоимость которых меньше средней стоимости определённой из массива2 | |
|
|
|
|
|
|
|
для: polopok
(10.02.2011 в 07:44)
| | А вы делайте третий массив со средними значениями цен во-первых ассоциативным, а во вторых не подсчитывайте среднюю цену сразу, а считайте суммарную стоимость и количество позиций. Потом при выводе - можно будет подсчитать среднюю стоимость.
<?php
$massiv1 = array(
array("2001", "Toyota Ist", "304000"),
array("2002", "Honda Odyssey", "354000")
);
$massiv2 = array(
array("2001", "Toyota Ist", "300000"),
array("2001", "Toyota Ist", "304000"),
array("2001", "Toyota Ist", "310000"),
array("2000", "Toyota Duet", "210000"),
array("2000", "Toyota Duet", "20000"),
array("2007", "Toyota Camry", "660000"),
array("2007", "Toyota Camry", "690000"),
array("2002", "Chevrolet Lanos", "250000"),
array("2002", "Chevrolet Lanos", "220000"),
array("2002", "Honda Odyssey", "354000"),
array("2002", "Honda Odyssey", "330000"),
array("2001", "LADA (ÂÀÇ) 2110", "280000"),
array("2001", "LADA (ÂÀÇ) 2110", "220000")
);
// Массив средних цен
$massiv3 = array();
for($i = 0; $i < count($massiv2); $i++)
{
// Ищем соотвествтие в первром массиве
for($j = 0; $j < count($massiv1); $j++)
{
if($massiv1[$j][0] == $massiv2[$i][0] &&
$massiv1[$j][1] == $massiv2[$i][1])
{
// Найдено совпадание - формируем массив средних цен
$massiv3[$massiv1[$j][0]." ".$massiv1[$j][1]][0] = $massiv2[$i][0];
$massiv3[$massiv1[$j][0]." ".$massiv1[$j][1]][1] = $massiv2[$i][1];
// Суммарная стоимость
$massiv3[$massiv1[$j][0]." ".$massiv1[$j][1]][2] += $massiv2[$i][2];
// Количество найденных позиций
$massiv3[$massiv1[$j][0]." ".$massiv1[$j][1]][3]++;
}
}
}
// Выводим средние значения
foreach($massiv3 as $key => $value)
{
echo $value[0]." ".$value[1]." - ".round($value[2]/$value[3])."<br />\r\n";
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(10.02.2011 в 08:33)
| | Да, спассибо! я тоже подозревал что нужен треттий массив, только как теперь сравнить $value[0]." ".$value[1]." - ".round($value[2]/$value с совпавшими выражениями массива1?
ведь мы уже вышли из цикла, а если начинать опять первые два цикла, то путаница может произойти:(( | |
|
|
|
|
|
|
|
для: polopok
(10.02.2011 в 09:13)
| | Собственно ничто не мешает создать 4 массив, с уже конечными средними ценами. | |
|
|
|
|
|
|
|
для: cheops
(10.02.2011 в 09:31)
| |
foreach($massiv3 as $key => $value)
{
$roma4[]= $value[0]." ".$value[1]." - ".$value[2]." - ".$value[3];
}
echo implode('<br>',$roma4);
|
| |
|
|
|
|
|
|
|
для: polopok
(10.02.2011 в 10:15)
| | . | |
|
|
|
|
|
|
|
для: cheops
(10.02.2011 в 10:19)
| | всё, с выводом разобрался)) щас попробую сравнить этот массив с первыми двумя | |
|
|
|
|
|
|
|
для: polopok
(10.02.2011 в 10:15)
| | Можете сделать так:
<?
//получаете имена авто, которые вас интересуют
$name = array_map('next',$massiv1);
//получаете средние цены этих авто
foreach($massiv2 as $v) {
reset($name);
do {
if(!isset($srch[current($name)])) $srch[current($name)] = 0;
if(in_array(current($name), $v)) $srch[current($name)] += round($v[2]/2);
} while(next($name));
}
echo "<pre>";
print_r($srch);
| Остаеся найти в массиве $massiv1 значения меньшее, чем вычесленные, опираясь на ключ массивов (можете и по индескам искать, ведь размеры массивов одинаковы будут).
PS. Вопрос - если эти массивы результат выборки из базы, может переложить часть задачи на нее нужно было? | |
|
|
|
|
|
|
|
для: sim5
(10.02.2011 в 10:23)
| | Да, можно было и переложитьчасть задачи на Mysql, но я не знаю как там создать соответствующие поля для этого и потом вывести результат, по этому принелся делать средствами пхп.
В принципе вот что у меня получилось, выводит те машины которые дешеле средней цены в базе:
<?php
$massiv1 = array(
array("2001", "Toyota Ist", "104000"),
array("2002", "Honda Odyssey", "154000")
);
$massiv2 = array(
array("2001", "Toyota Ist", "100000"),
array("2001", "Toyota Ist", "200000"),
array("2001", "Toyota Ist", "300000"),
array("2000", "Toyota Duet", "210000"),
array("2000", "Toyota Duet", "20000"),
array("2007", "Toyota Camry", "660000"),
array("2007", "Toyota Camry", "690000"),
array("2002", "Chevrolet Lanos", "250000"),
array("2002", "Chevrolet Lanos", "220000"),
array("2002", "Honda Odyssey", "354000"),
array("2002", "Honda Odyssey", "330000"),
array("2001", "LADA (ÂÀÇ) 2110", "280000"),
array("2001", "LADA (ÂÀÇ) 2110", "220000")
);
$massiv3 = array();
for($i = 0; $i < count($massiv2); $i++)
{
for($j = 0; $j < count($massiv1); $j++)
{
if($massiv1[$j][0] == $massiv2[$i][0] &&
$massiv1[$j][1] == $massiv2[$i][1])
{
$massiv3[$massiv1[$j][0]." ".$massiv1[$j][1]][0] = $massiv2[$i][0];
$massiv3[$massiv1[$j][0]." ".$massiv1[$j][1]][1] = $massiv2[$i][1];
$massiv3[$massiv1[$j][0]." ".$massiv1[$j][1]][2] += $massiv2[$i][2];
$massiv3[$massiv1[$j][0]." ".$massiv1[$j][1]][3]++;
}
}
}
foreach($massiv3 as $key => $value)
{
$massiv4[]= $value[0]."-".$value[1]."-".round($value[2]/$value[3]);
}
for($i = 0; $i < count($massiv4); $i++)
{
for($j = 0; $j < count($massiv1); $j++)
{ $linemess=explode("-",$massiv4[$j]);
if($linemess[0] == $massiv1[$i][0] &&
$linemess[1] == $massiv1[$i][1])
{
if ($massiv1[$i][2]<$linemess[2] )
{echo $massiv1[$i][0]." - ". $massiv1[$i][1]." - ".$massiv1[$i][2]."<br>"; }
}
}
}
?>
|
| |
|
|
|
|
|
|
|
для: polopok
(10.02.2011 в 10:42)
| | Слишком много писанного, все это сократить можно, как то сам код и лишние промежуточные массивы. | |
|
|
|
|
|
|
|
для: polopok
(10.02.2011 в 10:42)
| | еднственный тут косяк, что если в массиве две одинаковые машины сразной ценой но у обоих она меньше средней, выводится только одна из них:(((( что делать с этим??? а ведь истина уже совсем близко.. | |
|
|
|
|
|
|
|
для: polopok
(10.02.2011 в 10:53)
| | Заметьте, что я вам говорю одно, а вы сосвем другое. Изначально вы показали что хотели получить два масссива (не указывая зачем). Затем оказывается нужно сравнение по средней цене. Вы можете четко объянить, что в итоге все-таки должно быть - массив в котором авто, у которых цена ниже полученной средней, или несколько массивов (для чего каждый и какой)? | |
|
|
|
|
|
|
|
для: sim5
(10.02.2011 в 11:01)
| | попробую объяснить всю суть задачи:
Есть массив с вновь поступившими авто и база по которой нужно определить среднюю стоимость этих авто. И если цена вновь поступивших меньше чем средняя цена таких машин по базе на 20%, то выводим результат.
Как вы видите задача не из лёгких(по крайней мере для меня). по этому прощё её было разобрать по отдельным операциям | |
|
|
|
|
|
|
|
для: polopok
(10.02.2011 в 11:19)
| | Пока я вижу, что ничего трудного в задаче нет. :) И "отдельных" операций слишком много не требуется, если уж решать так.
Тут только вопрос вот какой - чем более у вас будет машин в базе какой либо марки, тем выше средняя цена будет, так как среднее, это сумма всех на число. Может быть тогда средняя цена для минимума и максимума должна браться? | |
|
|
|
|
|
|
|
для: sim5
(10.02.2011 в 11:20)
| | Но как тогда, вывисти все машини которые дешевле средней стоимости?
потомушто в том коде что я дописал число строк массива4 меньше чем массива1 и поэтому если там две одинаковые марки будут он вывидет только одну | |
|
|
|
|
|
|
|
для: sim5
(10.02.2011 в 11:20)
| | Средняя цена выше небудет, поскольку и количество машин будет тоже больше и делить мы будем просто теже числа только в разы больше. скажем 300000рублей/1000машин даст тотже результатт чтои 3000/10 | |
|
|
|
|
|
|
|
для: polopok
(10.02.2011 в 11:46)
| | Да, вы так думаете? Это если цена у машин будет одинаковая. | |
|
|
|
|
|
|
|
для: sim5
(10.02.2011 в 12:05)
| | Даже если и разная, всё равно в результате будет среднее число. Да собственно разговор не об этом. может вы лучше подскажите как добиться вышеизложеного результата? | |
|
|
|
|
|
|
|
для: polopok
(10.02.2011 в 12:09)
| | Получать из базы данные для расчета надо только тех машин, которые к вам поступили (в примере это Toyota и Honda), и только необходимых данных (имя, цена, у вас еще год, который не нужен при операциях), а у вас там и Лада еще и т.п.. Зачем гонять лишнюю попусту?
Что касается дальнейшего, то все проще можно сделать, нежели вы делаете. Вопрос как раз в ориентире - если брать среднюю цену всех, то она у вас будет расти постонно, если это удовлетворяет нет проблем. Если брать цену среднюю от минимальной и максимальной, то она будет может быть и постоянной, ну или иредко изменяемой, но подходит ли она вам.
Если брать по первому варианту то (с учетом вышесказанного - у вас должен быть массив из базы только поступивших авто, и только необходимых их данных):
<?
$dist = array(
array("Toyota Ist", "100000"),
array("Toyota Ist", "200000"),
array("Toyota Ist", "300000"),
array("Toyota Duet", "210000"),
array("Toyota Duet", "20000"),
array("Toyota Camry", "660000"),
array("Toyota Camry", "690000"),
array("Honda Odyssey", "354000"),
array("Honda Odyssey", "330000")
);
//считаем среднюю цену
$name = $dist[0][0];
$srch = array($name => 0);
foreach($dist as $v) {
if($name != $v[0]) {
$name = $v[0];
$srch[$name] = 0;
}
$srch[$name] += round($v[1]/2);
}
//это получившийся массив имен авто и их средняя цена
print_r($srch);
| Осталось пройтись по массиву поступивших машин, и сравнить среднюю цену из массива $srch по тем условиям, которые вам нужны.
PS. А теперь посчитайте калькулятором среднюю цену для разных групп, какова она?
PPS. Получив массив который удовлетворяет проценту от средней стоимости, функцией пересечения массивов получайте из массива пришедших авто эти авто, и далее их добавление в базу, надо полгать это конечная цель. | |
|
|
|
|
|
|
|
для: sim5
(10.02.2011 в 12:13)
| | теперь понятно, почему вы думаеете, что средняя цена будет расти.
исходя из вашего скрипта, средняя цена Toyota Ist состовляет 300 000.
Однако если сложить 100 000 + 200 000 + 300 000 и разделить на 3,
то получиться 200 000 | |
|
|
|
|
|
|
|
для: polopok
(10.02.2011 в 12:24)
| | Точно, не так подумал. Ну надо немного изменить код, совсем чуточку, но сразу считать среднюю стоимость, без этих лишних действий и массивов промежуточных, а дале так как я писал. | |
|
|
|
|
|
|
|
для: sim5
(10.02.2011 в 12:13)
| | Но суть мне ясна, т.е вы предлагаете определить среднюю цену всех машин находящихся в базе, а потом сравнить с массивом поступившах.
PS
Однако хочу заметить что и год тоже тут принимает участие потому как испать нужно выражение в виде ГОДАВТО - это делает более точное определение цен | |
|
|
|
|
|
|
|
для: polopok
(10.02.2011 в 12:30)
| | Я не вижу, что бы хоть где-то учитывали год. Где вы ранее упоминали, что при расчете средней цены, учитывать год? Каким боком он может влиять на это? Если искать среднюю цену только среди годов выпуска тех авто, которые тоже этого года, то почему у вас в массиве они разного? Ну получайте только те что равны. Вы либо определитесь сперва с условиями поиска, расчета, и т.д., аж уж потом выставляйте задачу. Иначе.... | |
|
|
|
|
|
|
|
для: cheops
(10.02.2011 в 08:33)
| | Я попробывал ещё такой вариант вывода машин меньшей стоимости,
тут всё хорошо, но опять получаеться что почемуто одну и туже машину выводит два раза а другую один раз - мистика какаято. Подскажите плз. как ещё можно это сделать???
<?php // выводим среднее значение
foreach($massiv3 as $key => $value)
{
for($j = 0; $j < count($massiv1); $j++)
{
if($massiv1[$j][2]<round($value[2]/$value[3]))
{$massiv4[]=$massiv1[$j][0].$massiv1[$j][1].$massiv1[$j][2]; }
}
}
echo implode('<br>',$massiv4);
|
| |
|
|
|
|