[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Нахождение суммы строк во всех базах через цикл
linf
Имеется 20 баз на CSV.
Количество строк в каждой, я могу вывести так:

PHP
<?php 
$i 
1
while (
$i <= 20):
$file file("base/$i.csv");
echo 
count($file), " строк<BR>";
    
$i++;
endwhile;


А вот как найти сумму строк во всех базах?
Как найти найти минимум и максимум строк в базах?

К примеру:
Всего ХХХ строк во всех базах.
Больше всего строк в базе "5" (Х)
Меньше всего строкй в базе "9" (X)

Если не сложно, с комментариями по коду =))



Спустя 21 минута, 5 секунд (5.07.2009 - 02:52) kirik написал(а):
Держи. Не проверял, но должно работать smile.gif

PHP
// опеределяем массив с данными
$stats = array(
    'total' => 0,
    'maximum' => array('db' => null, 'lines' => 0), 
    
'minimum' => array('db' => null, 'lines' => 0),
);

// запускаем цикл
for($i = 1; $i <= 20; $i++)
{
    $file = './base/'.$i.'.csv'; // определяем путь до файла БД
    $data = file($file); // достаем все строки из файла
    $lines = count($data); // считаем количество строк
    unset($data); // очищаем переменную

    $stats['total'] += $lines; // суммируем общее кол-во строк

    // если БД с максимальным кол-вом строк еще не задана, или это значение меньше текущего - перезаписываем
    if($stats['maximum']['db'] === null || $lines > $stats['maximum']['lines'])
    {
        $stats['maximum']['db'] = $file;
        $stats['maximum']['lines'] = $lines;
    }

    // если БД с минимальным кол-вом строк еще не задана, или это значение больше текущего - перезаписываем
    if($stats['minimum']['db'] === null || $lines < $stats['minimum']['lines'])
    {
        $stats['minimum']['db'] = $file;
        $stats['minimum']['lines'] = $lines;
    }

    echo 'В файле "'.$file.'": '.$lines.' строк<br />';
}

// выводим данные о количествах
echo 'Всего строк: '.$stats['total'].';<br />
Максимум строк: '
.$stats['maximum']['lines'].' (в базе '.$stats['maximum']['db'].');<br />
Минимум строк: '
.$stats['minimum']['lines'].' (в базе '.$stats['minimum']['db'].');';

Спустя 1 час, 40 минут, 4 секунды (5.07.2009 - 04:32) linf написал(а):
kirik, ну и скорость у вас... профессионалы =))
не прошло и пол часа...
ща буду пробовать... честно код кажется сложноватым, думал будет намного проще...

Спустя 23 минуты, 53 секунды (5.07.2009 - 04:56) kirik написал(а):
Цитата (linf @ 4.07.2009 - 20:32)
естно код кажется сложноватым, думал будет намного проще...

Можно подумать и сделать размером поменьше, но он будет еще сложнее smile.gif

Спустя 7 часов, 57 минут, 18 секунд (5.07.2009 - 12:53) linf написал(а):
Так как я новичок, хочу понят некоторые моменты:

1. Почему некоторые переменные окружены точками?
2. Для чего создается массив?
3. Если не нужно указывать сколько в какой базе конкретно, и убрать это (echo 'В файле "'.$file.'": '.$lines.' строк<br />';), то что можно еще убрать из кода?

4. Как ввести названия баз, что бы вместо:

Максимум строк: 7 (в базе ./base/20.csv);
Минимум строк: 0 (в базе ./base/3.csv);


было к примеру:

Максимум строк: 7 в базе "название базы 20"
Минимум строк: 0 в базе "Название базы 3";


Спустя 4 часа, 30 минут, 34 секунды (5.07.2009 - 17:23) kirik написал(а):
Цитата (linf @ 5.07.2009 - 04:53)
1. Почему некоторые переменные окружены точками?

Это символы конкотенации (объединение строк).

Цитата (linf @ 5.07.2009 - 04:53)
2. Для чего создается массив?

Для того, чтобы хранить в нем данные smile.gif

Цитата (linf @ 5.07.2009 - 04:53)
3. Если не нужно указывать сколько в какой базе конкретно, и убрать это (echo 'В файле "'.$file.'": '.$lines.' строк<br />';), то что можно еще убрать из кода?

Хороший вопрос. Смотря что тебе от кода нужно.. Можно вообще все убрать wink.gif

Цитата (linf @ 5.07.2009 - 04:53)
4. Как ввести названия баз, что бы вместо:

Подумай-ка smile.gif

Спустя 22 часа, 23 минуты, 1 секунда (6.07.2009 - 15:46) Alchemist написал(а):
Если сервер на *nix системе, то можно и короче smile.gif
PHP
$text = `wc -l base/*.csv`;   // считаем строки
preg_match_all('/([\d]+) ([\S]+)/',$text,$matches);   // парсим данные
$result = array_combine($matches[2],$matches[1]);  // форматируем их удобства для

$total = array_pop($result);  // убираем общее кол-во
$edges = array(max($result),min($result));  // находим максимум и минимум

echo "Total: ".$total."<br />\n";
echo "max ".$edges[0]." in ".array_search($edges[0],$result)."<br />\n";
echo "min ".$edges[1]." in ".array_search($edges[1],$result)."<br />\n";

Спустя 20 минут, 32 секунды (6.07.2009 - 16:07) glock18 написал(а):
только стало ли понятней... smile.gif

Спустя 2 минуты, 55 секунд (6.07.2009 - 16:10) Alchemist написал(а):
тогда вот еще вариант smile.gif
PHP
preg_match_all('/([\d]+) ([\S]+)/',`wc -l base/*.csv`,$matches);
asort($matches[1]);

echo "Total: ".array_pop($matches[1])."<br />\n";
echo "max ".current($matches[1])." in ".$matches[2][key($matches[1])]."<br />\n";
echo "min ".end($matches[1])." in ".$matches[2][key($matches[1])]."<br />\n";

Спустя 7 дней, 12 часов, 12 минут, 27 секунд (14.07.2009 - 04:22) linf написал(а):
Супер... у меня то linux... но будет ли работать на хостинге который я еще не выбрал это вопрос!

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

И все же, как ввести вместо названий файлов относительные их названия...?


Спустя 13 минут, 16 секунд (14.07.2009 - 04:36) kirik написал(а):
Цитата (linf @ 13.07.2009 - 20:22)
И все же, как ввести вместо названий файлов относительные их названия...?

непонЯл...

Спустя 6 часов, 52 минуты, 8 секунд (14.07.2009 - 11:28) Alchemist написал(а):
Цитата
А в 2 строки можешь? smile.gif


Гы, как два пальца абасвальт smile.gif

PHP
preg_match_all('/([\d]+) ([\S]+)/',`wc -l base/*.csv | sort -bn`,$matches);

echo 
"Total: ".array_pop($matches[1])."<br />\n
      max "
.$matches[1][0]." in ".$matches[2][0]."<br />\n
      min "
.end($matches[1])." in ".end($matches[2])."<br />\n";

Спустя 9 часов, 9 минут, 57 секунд (14.07.2009 - 20:38) kirik написал(а):
Цитата (Alchemist @ 14.07.2009 - 03:28)
Гы, как два пальца абасвальт

Ну ты... совести у тебя нет smile.gif

Спустя 1 час, 36 минут, 14 секунд (14.07.2009 - 22:14) linf написал(а):
Цитата (Alchemist @ 14.07.2009 - 12:28)
Цитата
А в 2 строки можешь? smile.gif


Гы, как два пальца абасвальт smile.gif

PHP
preg_match_all('/([\d]+) ([\S]+)/',`wc -l base/*.csv | sort -bn`,$matches);

echo "Total: ".array_pop($matches[1])."<br />\n
      max "
.$matches[1][0]." in ".$matches[2][0]."<br />\n
      min "
.end($matches[1])." in ".end($matches[2])."<br />\n";

А если базам нужно присвоить названия!
что бы потом выводить их:


максимум в "название 5 базы"
минимум в "название 3 базы"




Спустя 2 часа, 48 минут, 56 секунд (15.07.2009 - 01:03) Alchemist написал(а):
linf, ты писал это уже 3 раза, но еще ни разу не написал где взять эти названия.

Спустя 2 дня, 19 часов, 49 минут, 8 секунд (17.07.2009 - 20:52) linf написал(а):
Alchemist Нзваний в самих базах нет, но допустим я знаю, что
1.csv называется к примеру "Москва",
2.csv называется "Питер"
3.csv называется "Воронеж"
итд...

Я так понимаю нужно ввести еще один массив в прировнять, да?
Как это можно сделать?

Спустя 2 часа, 17 минут, 21 секунда (17.07.2009 - 23:09) Alchemist написал(а):
kirik тебе в помощь...

Спустя 2 часа, 21 минута, 10 секунд (18.07.2009 - 01:30) kirik написал(а):
Цитата (Alchemist @ 17.07.2009 - 15:09)
kirik тебе в помощь...

biggrin.gif

Цитата (linf @ 17.07.2009 - 12:52)
Я так понимаю нужно ввести еще один массив в прировнять, да?

Угу..
PHP
// Объявляем ассоциативный массив id_базы => 'название'
$db_assoc = array(
   
=> 'Москва',
   
=> 'Петербург',
   
=> 'Воронеж'
);
// -------------
// в скрипте меняем это
    
$file './base/'.$i.'.csv';
// на это
    
$file './base/'.$i.'.csv';
    
$db_name = isset($db_assoc[$i]) ? $db_assoc[$i] : 'Название базы не определено в массиве';
// -------------
// это
        
$stats['maximum']['db'] = $file;
// на это
        
$stats['maximum']['db'] = $db_name;
// -------------
// и это
        
$stats['minimum']['db'] = $file;
// на это
        
$stats['minimum']['db'] = $db_name;

Спустя 5 дней, 47 минут, 27 секунд (23.07.2009 - 02:18) linf написал(а):
kirik спасибо огромное, все работает как надо, к тому же научился правильно массивы составлять...


_____________
Live in new format =)
Быстрый ответ:

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