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

Форум PHP

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

 

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

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

тема: Вычислить среднюю стоимость машин
 
 автор: polopok   (10.02.2011 в 07:44)   письмо автору
 
 

Здравствуйте, у меня похожая ситуация, но подобным способом решить её что-то не получаеться:(((
Есть 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 (&#194;&#192;&#199;) 2110""280000"),
array(
"2001""LADA (&#194;&#192;&#199;) 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", "средняя цена"),
);

  Ответить  
 
 автор: sim5   (10.02.2011 в 07:59)   письмо автору
 
   для: polopok   (10.02.2011 в 07:44)
 

У вас совсем иная ситуация. Вам конечным результатом ведь надо узнать среднюю стоимость неких авто?

  Ответить  
 
 автор: polopok   (10.02.2011 в 08:09)   письмо автору
 
   для: sim5   (10.02.2011 в 07:59)
 

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

  Ответить  
 
 автор: sim5   (10.02.2011 в 08:35)   письмо автору
 
   для: polopok   (10.02.2011 в 08:09)
 

Первый массив для чего служит?

  Ответить  
 
 автор: polopok   (10.02.2011 в 09:09)   письмо автору
 
   для: sim5   (10.02.2011 в 08:35)
 

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

  Ответить  
 
 автор: cheops   (10.02.2011 в 08:33)   письмо автору
 
   для: 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 (&#194;&#192;&#199;) 2110""280000"), 
    array(
"2001""LADA (&#194;&#192;&#199;) 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";
  }
?>

  Ответить  
 
 автор: polopok   (10.02.2011 в 09:13)   письмо автору
 
   для: cheops   (10.02.2011 в 08:33)
 

Да, спассибо! я тоже подозревал что нужен треттий массив, только как теперь сравнить $value[0]." ".$value[1]." - ".round($value[2]/$value с совпавшими выражениями массива1?
ведь мы уже вышли из цикла, а если начинать опять первые два цикла, то путаница может произойти:((

  Ответить  
 
 автор: cheops   (10.02.2011 в 09:31)   письмо автору
 
   для: polopok   (10.02.2011 в 09:13)
 

Собственно ничто не мешает создать 4 массив, с уже конечными средними ценами.

  Ответить  
 
 автор: polopok   (10.02.2011 в 10:15)   письмо автору
 
   для: cheops   (10.02.2011 в 09:31)
 

   foreach($massiv3 as $key => $value)
  {
    $roma4[]= $value[0]." ".$value[1]." - ".$value[2]." - ".$value[3];


  }

echo implode('<br>',$roma4);

  Ответить  
 
 автор: cheops   (10.02.2011 в 10:19)   письмо автору
 
   для: polopok   (10.02.2011 в 10:15)
 

.

  Ответить  
 
 автор: polopok   (10.02.2011 в 10:21)   письмо автору
 
   для: cheops   (10.02.2011 в 10:19)
 

всё, с выводом разобрался)) щас попробую сравнить этот массив с первыми двумя

  Ответить  
 
 автор: sim5   (10.02.2011 в 10:23)   письмо автору
 
   для: 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. Вопрос - если эти массивы результат выборки из базы, может переложить часть задачи на нее нужно было?

  Ответить  
 
 автор: polopok   (10.02.2011 в 10:42)   письмо автору
 
   для: 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 (&#194;&#192;&#199;) 2110""280000"),
    array(
"2001""LADA (&#194;&#192;&#199;) 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>"; }
      }
      }
      }




  
?>

  Ответить  
 
 автор: sim5   (10.02.2011 в 10:46)   письмо автору
 
   для: polopok   (10.02.2011 в 10:42)
 

Слишком много писанного, все это сократить можно, как то сам код и лишние промежуточные массивы.

  Ответить  
 
 автор: polopok   (10.02.2011 в 10:53)   письмо автору
 
   для: polopok   (10.02.2011 в 10:42)
 

еднственный тут косяк, что если в массиве две одинаковые машины сразной ценой но у обоих она меньше средней, выводится только одна из них:(((( что делать с этим??? а ведь истина уже совсем близко..

  Ответить  
 
 автор: sim5   (10.02.2011 в 11:01)   письмо автору
 
   для: polopok   (10.02.2011 в 10:53)
 

Заметьте, что я вам говорю одно, а вы сосвем другое. Изначально вы показали что хотели получить два масссива (не указывая зачем). Затем оказывается нужно сравнение по средней цене. Вы можете четко объянить, что в итоге все-таки должно быть - массив в котором авто, у которых цена ниже полученной средней, или несколько массивов (для чего каждый и какой)?

  Ответить  
 
 автор: polopok   (10.02.2011 в 11:19)   письмо автору
 
   для: sim5   (10.02.2011 в 11:01)
 

попробую объяснить всю суть задачи:
Есть массив с вновь поступившими авто и база по которой нужно определить среднюю стоимость этих авто. И если цена вновь поступивших меньше чем средняя цена таких машин по базе на 20%, то выводим результат.
Как вы видите задача не из лёгких(по крайней мере для меня). по этому прощё её было разобрать по отдельным операциям

  Ответить  
 
 автор: sim5   (10.02.2011 в 11:20)   письмо автору
 
   для: polopok   (10.02.2011 в 11:19)
 

Пока я вижу, что ничего трудного в задаче нет. :) И "отдельных" операций слишком много не требуется, если уж решать так.

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

  Ответить  
 
 автор: polopok   (10.02.2011 в 11:33)   письмо автору
 
   для: sim5   (10.02.2011 в 11:20)
 

Но как тогда, вывисти все машини которые дешевле средней стоимости?
потомушто в том коде что я дописал число строк массива4 меньше чем массива1 и поэтому если там две одинаковые марки будут он вывидет только одну

  Ответить  
 
 автор: polopok   (10.02.2011 в 11:46)   письмо автору
 
   для: sim5   (10.02.2011 в 11:20)
 

Средняя цена выше небудет, поскольку и количество машин будет тоже больше и делить мы будем просто теже числа только в разы больше. скажем 300000рублей/1000машин даст тотже результатт чтои 3000/10

  Ответить  
 
 автор: sim5   (10.02.2011 в 12:05)   письмо автору
 
   для: polopok   (10.02.2011 в 11:46)
 

Да, вы так думаете? Это если цена у машин будет одинаковая.

  Ответить  
 
 автор: polopok   (10.02.2011 в 12:09)   письмо автору
 
   для: sim5   (10.02.2011 в 12:05)
 

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

  Ответить  
 
 автор: sim5   (10.02.2011 в 12:13)   письмо автору
 
   для: 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. Получив массив который удовлетворяет проценту от средней стоимости, функцией пересечения массивов получайте из массива пришедших авто эти авто, и далее их добавление в базу, надо полгать это конечная цель.

  Ответить  
 
 автор: polopok   (10.02.2011 в 12:24)   письмо автору
 
   для: sim5   (10.02.2011 в 12:13)
 

теперь понятно, почему вы думаеете, что средняя цена будет расти.
исходя из вашего скрипта, средняя цена Toyota Ist состовляет 300 000.
Однако если сложить 100 000 + 200 000 + 300 000 и разделить на 3,
то получиться 200 000

  Ответить  
 
 автор: sim5   (10.02.2011 в 12:29)   письмо автору
 
   для: polopok   (10.02.2011 в 12:24)
 

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

  Ответить  
 
 автор: polopok   (10.02.2011 в 12:30)   письмо автору
 
   для: sim5   (10.02.2011 в 12:13)
 

Но суть мне ясна, т.е вы предлагаете определить среднюю цену всех машин находящихся в базе, а потом сравнить с массивом поступившах.
PS
Однако хочу заметить что и год тоже тут принимает участие потому как испать нужно выражение в виде ГОДАВТО - это делает более точное определение цен

  Ответить  
 
 автор: sim5   (10.02.2011 в 13:07)   письмо автору
 
   для: polopok   (10.02.2011 в 12:30)
 

Я не вижу, что бы хоть где-то учитывали год. Где вы ранее упоминали, что при расчете средней цены, учитывать год? Каким боком он может влиять на это? Если искать среднюю цену только среди годов выпуска тех авто, которые тоже этого года, то почему у вас в массиве они разного? Ну получайте только те что равны. Вы либо определитесь сперва с условиями поиска, расчета, и т.д., аж уж потом выставляйте задачу. Иначе....

  Ответить  
 
 автор: polopok   (10.02.2011 в 13:09)   письмо автору
 
   для: 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);

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

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