Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Сумма чисел в столбце


Автор: SeregaGREY 28.7.2009, 23:12
Вот пишу скрипт работающий с файлом вида:
Код

один|два|три|круто|
один|два|три|некруто|
один|два|три|круто|


написал вот это:
Код

<?
$data = File("bd.dat");
echo "<table width=100% border=1 cellpadding=0 cellspacing=0 bordercolor=#cccccc><tr>";
for ($i=0;$i<count($data);$i++) {
$data_array = explode("|", $data[$i]);
{
    echo "<td><right>$data_array[1]";
    
    }

echo "</tr>";
}

echo "</table>";
?>


Вот оно мне выводит всё что в столбце #2. а как мне не выводить это содержимое а сложить?

И ещё как сложить только те строки в столбце #2, которые имеют в столбце #4 слово "круто"?

Автор: s0lman 29.7.2009, 00:04
Как вариант - объявить массив
Код

$num=array('1'=>'один', '2'=>'два');

а извлекать числовое значения для суммирования так
Код

$val=array_search($data_array[1],$num);


Добавлено через 3 минуты и 4 секунды
Цитата(SeregaGREY @  28.7.2009,  23:12 Найти цитируемый пост)
И ещё как сложить только те строки в столбце #2, которые имеют в столбце #4 слово "круто"? 

Дополнительная проверка
Код

if($data_array[3]=='круто'){$sum+=$val;}

Автор: SeregaGREY 29.7.2009, 09:29
непонял. где тут суммирование значений второго столбца?

Автор: Ипатьев 29.7.2009, 09:30
SeregaGREY, а каков результат сложения? одинодинодин?

Автор: s0lman 29.7.2009, 09:41
Ипатьев, внимательно читайте условие: двадвадва   smile 

Автор: NLspieler 29.7.2009, 10:22
Код

<?php
/*
Такой синтаксис файла будет более приемлимым:

1|2|3|круто
1|2|3|некруто
1|2|3|круто
*/

$stroki = file ('bd.dat') ;

$otwet = 0 ; //Переменная для ответа

foreach ($stroki as $stroka) //Проходимся по массиву  
{
    $yacheiki = explode ("|" , $stroka) ; //Разделяем строку на 4 ячейчи
    if ($yacheiki[3]=='круто') //Если в 4 ячейки текст "круто"
    {
        $otwet += $yacheiki[1] ; //Прибавляем к ответу значение второй ячейчи
    }
}

echo $otwet ; //Отображаем ответ

?>


Твой код:

Код

<?
$data = File("bd.dat");         //функция file пишется с маленькой буквы 
echo "<table width=100% border=1 cellpadding=0 cellspacing=0 bordercolor=#cccccc><tr>";

for ($i=0;$i<count($data);$i++) {
$data_array = explode("|", $data[$i]);
{  //Для чего эта скобка?

    echo "<td><right>$data_array[1]"; //такой код работать не будет 
    //можно написать так echo  echo "<td><right>" . $data_array[1]; 
   //Это конечно вопрос не php, но все же, где закрывающие теги?
    
    } //Для чего эта скобка?

echo "</tr>";
}

echo "</table>";
?>


Функцию count($data) в заголовке цикла лучше не использовать. Нужно писать так:
Код

$count = count($data) ;
for ($i=0; $i<$count; $i++)

А еще лучше для таких ситуаций использовать цикл foreach

Автор: s0lman 29.7.2009, 10:56
Цитата(NLspieler @  29.7.2009,  10:22 Найти цитируемый пост)
А еще лучше для таких ситуаций использовать цикл foreach

Вот здесь ни разу не согласен

Цитата(NLspieler @  29.7.2009,  10:22 Найти цитируемый пост)
$count = count($data) ;
for ($i=0; $i<$count; $i++)

намного лучше в данной ситуации smile

Автор: NLspieler 29.7.2009, 11:02
Цитата(s0lman @  29.7.2009,  10:56 Найти цитируемый пост)
Вот здесь ни разу не согласен

И почему же?

Автор: fesor 29.7.2009, 11:40
foreach медленнее чем for)) и жрет больше памяти)

Автор: s0lman 29.7.2009, 11:46
Быстродействие. 
Не вижу смысла его использовать для индексных массивов, тем более, если значения ключей имеют последовательные значения, без пропусков.

Добавлено через 59 секунд
fesor, долго я печатал ))

Автор: NLspieler 29.7.2009, 11:47
Цитата(fesor @  29.7.2009,  11:40 Найти цитируемый пост)
foreach медленнее чем for)) и жрет больше памяти)


В PHP4 да, в PHP5 он напротив быстрее и жрет нисколько не больше памяти.

Да и писать
Код

foreach ($array as $value) 


гораздо быстрее чем

Код

$count = count ($array)
for ($n=0; $n<$count; $n++)


Кстати, такая тема уже обсуждалась 
http://forum.vingrad.ru/forum/topic-258847.html

Автор: nerezus 29.7.2009, 11:49
Цитата

намного лучше в данной ситуации
 Почему 2 строчки-костыля лучше нормального варианта?

Автор: Ипатьев 29.7.2009, 15:27
Цитата

Поводом к  войне послужили следующие
обстоятельства.   Всеми   разделяется убеждение,   что  вареные  яйца  при
употреблении  их  в  пищу  испокон  веков разбивались с тупого конца; но дед
нынешнего  императора, будучи ребенком,  порезал  себе палец за завтраком,
разбивая  яйцо означенным  древним способом. Тогда император, отец ребенка,
обнародовал  указ,  предписывающий  всем  его подданным под страхом строгого
наказания  разбивать  яйца  с острого конца. Этот закон до такой степени
озлобил  население,  что,  по  словам  наших  летописей,  был причиной шести
восстаний,  во время  которых один  император  потерял  жизнь,  а другой -
корону[36].  Мятежи эти постоянно разжигались монархами Блефуску, а после их
подавления  изгнанники всегда находили приют в этой империи. Насчитывают до
одиннадцати тысяч фанатиков, которые в течение этого времени пошли на казнь,
лишь  бы  не  разбивать яйца с острого конца. Были напечатаны сотни огромных
томов, посвященных этой полемике...

Дж.Свифт, "Путешествия Гулливера"

Автор: SeregaGREY 29.7.2009, 18:35
Цитата(NLspieler @ 29.7.2009,  10:22)
Код

<?php
/*
Такой синтаксис файла будет более приемлимым:

1|2|3|круто
1|2|3|некруто
1|2|3|круто
*/

$stroki = file ('bd.dat') ;

$otwet = 0 ; //Переменная для ответа

foreach ($stroki as $stroka) //Проходимся по массиву  
{
    $yacheiki = explode ("|" , $stroka) ; //Разделяем строку на 4 ячейчи
    if ($yacheiki[3]=='круто') //Если в 4 ячейки текст "круто"
    {
        $otwet += $yacheiki[1] ; //Прибавляем к ответу значение второй ячейчи
    }
}

echo $otwet ; //Отображаем ответ

?>


Твой код:

Код

<?
$data = File("bd.dat");         //функция file пишется с маленькой буквы 
echo "<table width=100% border=1 cellpadding=0 cellspacing=0 bordercolor=#cccccc><tr>";

for ($i=0;$i<count($data);$i++) {
$data_array = explode("|", $data[$i]);
{  //Для чего эта скобка?

    echo "<td><right>$data_array[1]"; //такой код работать не будет 
    //можно написать так echo  echo "<td><right>" . $data_array[1]; 
   //Это конечно вопрос не php, но все же, где закрывающие теги?
    
    } //Для чего эта скобка?

echo "</tr>";
}

echo "</table>";
?>


Функцию count($data) в заголовке цикла лучше не использовать. Нужно писать так:
Код

$count = count($data) ;
for ($i=0; $i<$count; $i++)

А еще лучше для таких ситуаций использовать цикл foreach

спасибо! всё красиво разъяснил!

Автор: nerezus 29.7.2009, 20:19
Цитата

Дж.Свифт, "Путешествия Гулливера"
 Наверное тебе просто не приходилось разбираться в "наоптимизированном" коде.

Автор: s0lman 29.7.2009, 21:52
В общем, провел несколько опытов.
Для опыта использовал индексный массив из 100 тыс. элементов.
В первой части опыта просто получал доступ к значению каждого элемента, а во второй уже выполнял действия с самими элементами массива.
Результаты меня немного удивили.
В первой части опыта foreach и for с переменным успехом опережали друг друга, с чего можно сделать вывод, что их использование примерно одинаковое по производительности, но цикл foreach гораздо удобнее использовать. Признаю свою ошибку выше ;)
Во второй части опыта, как и ожидалось, foreach  показал очень низкий результат, что не располагает к его использованию в подобных ситуациях.

З.Ы. Результаты опыта у меня примерно такие:
Цитата

foreach access 0.041108
for access 0.038568
foreach replace 0.153307
for replace 0.053427 


З.З.Ы.
На случай, если кто захочет проверить, прилеплю свой гениальный код  smile  

Автор: Ипатьев 29.7.2009, 22:35
Цитата(s0lman @  29.7.2009,  21:52 Найти цитируемый пост)
очень низкий результат, что не располагает к его использованию в подобных ситуациях.

В подобных - это в каких? В циклах на сто тыщ итераций? Соглашусь. Для 0,00001% программ, где требуется такое количество оборотов, данная рекомендация будет иметь смысл.

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

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

Автор: s0lman 29.7.2009, 22:39
Цитата(Ипатьев @  29.7.2009,  22:35 Найти цитируемый пост)
В подобных - это в каких? 

В случаях изменения значения элементов массива smile

Автор: Ипатьев 29.7.2009, 22:46
У автора топика этих элементов будет максимум сотня. Стоит ли разница в скорости на таком количестве итераций потраченного времени на обсуждение и тесты? 

Неужели не стыдно преподносить всю эту ерунду, как чудесные озарения, проливающие свет на всю дальнейшую профессиональную деятельность? 

Автор: nerezus 29.7.2009, 22:48
Цитата

Для опыта использовал индексный массив из 100 тыс. элементов.
 Какое количество от всех проектов они составляли?

Автор: s0lman 29.7.2009, 23:13
Ипатьев, я вас не совсем понимаю. Если вам проще написать более удобный код вместо чуть более эффективного, я не пытаюсь вас переубеждать smile 
Можно также полагаться на мощь серверов, для которых сэкономленные ресурсы не сыграют особой роли... С другой стороны некоторые рекомендуют использовать одинарные кавычки для вывода текста. В нашем же случае с циклами, думается, разница в быстродействии более заметна.

Цитата(nerezus @  29.7.2009,  22:48 Найти цитируемый пост)
Какое количество от всех проектов они составляли? 

Большое количество элементов взял для большей точности вычислений. В итоге, как видим, при изменении массива цикл foreach почти втрое медленней for.

Автор: nerezus 29.7.2009, 23:19
Цитата

Большое количество элементов взял для большей точности вычислений. 
 А может оно действует по принципу противоКота Шредингера(принцип религии), и твое "увеличение" некоректно?

Автор: Ипатьев 29.7.2009, 23:20
Дело в том, что относительные цифры ("в полтора раза") не значат ничего. Многие люди этого не понимают. Ведро воды больше, чем стакан? В 50 раз. А в масштабе мирового океана это имеет хоть какое-то значение? Или хотя бы в масштабе бассейна? 
И не надо мне тыкать ресурсами. Ресурсы экономят не на кавычках. 

Автор: icewind 29.7.2009, 23:42
Согласен с Ипатьев.

Цитата(Ипатьев @  29.7.2009,  23:20 Найти цитируемый пост)
Ведро воды больше, чем стакан? В 50 раз. А в масштабе мирового океана это имеет хоть какое-то значение?

Особенно если оперировать придется максимум наперстками...

Автор: SeregaGREY 6.8.2009, 12:23
а как теперь можно не только складывать значения в столбцах, но и умножать значения в строках применительно к вашему скрипту?
то есть например:

1|2|3|круто
1|2|3|некруто
1|2|3|круто

в строках умножить 1ое и 3е значения и сложить все эти умнождения?

1*3 +1*3+1*3 = 9

Код

<?php
/*
Такой синтаксис файла будет более приемлимым:

1|2|3|круто
1|2|3|некруто
1|2|3|круто
*/

$stroki = file ('bd.dat') ;

$otwet = 0 ; //Переменная для ответа

foreach ($stroki as $stroka) //Проходимся по массиву  
{
    $yacheiki = explode ("|" , $stroka) ; //Разделяем строку на 4 ячейчи
    if ($yacheiki[3]=='круто') //Если в 4 ячейки текст "круто"
    {
        $otwet += $yacheiki[1] ; //Прибавляем к ответу значение второй ячейчи
    }
}

echo $otwet ; //Отображаем ответ

?>

Автор: Ипатьев 6.8.2009, 12:32
Вот, кстати, о пользе написания готовых скриптов.
Казалось бы, простейшая операция - умножение. И, наверняка, если бы автор вопроса написал код сам, и понимал значение используемых в нем переменных, то с легкостью смог бы их перемножить.
А поскольку для него код - абракадабра, то даже с таким простым вопросом идет за помощью на форум.

SeregaGREY, твои значения лежат в массиве $yacheiki. Неужели ты не можешь перемножить две переменные?

Автор: SeregaGREY 6.8.2009, 12:57
Цитата(Ипатьев @ 6.8.2009,  12:32)
Вот, кстати, о пользе написания готовых скриптов.
Казалось бы, простейшая операция - умножение. И, наверняка, если бы автор вопроса написал код сам, и понимал значение используемых в нем переменных, то с легкостью смог бы их перемножить.
А поскольку для него код - абракадабра, то даже с таким простым вопросом идет за помощью на форум.

SeregaGREY, твои значения лежат в массиве $yacheiki. Неужели ты не можешь перемножить две переменные?

$otwet += $yacheiki[1] *$yacheiki[3];
так?

Автор: Ипатьев 6.8.2009, 13:22
Примерно. Только элементы в массиве нумеруются с нуля, а значит должно быть
Код

$otwet += $yacheiki[0] *$yacheiki[2];


Автор: s0lman 6.8.2009, 15:04

<offtop>
Чем-то мне Ипатьев напоминает Фельдмаршала smile
</offtop>


Автор: bars80080 7.8.2009, 13:57
Цитата(s0lman @  6.8.2009,  15:04 Найти цитируемый пост)
Чем-то мне Ипатьев напоминает Фельдмаршала 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)