Перейти к содержимому


Выбрать шаблон и создать сайт

  • Закрытая тема Тема закрыта

Функция fgetcsv()

#11 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71
0

Отправлено 02 Январь 2011 - 23:21

<?php
$handle = fopen("order.txt", "r");
$buffer=array();
while (!feof($handle))
{
$buffer[] = fgets($handle);
}
fclose($handle);
$newarr = array_unique($buffer);
// распечатываем содержимое массива
echo "<pre>";
print_r ($newarr);
echo "</pre>";
?>


order..txt

19:48:39 1st, 5 покрышек, 34 масла, 1 свечей, всего: $1012.8
20:01:10 1st, 32 покрышек, 1 масла, 12 свечей, всего: $3909.6
20:01:10 1st, 32 покрышек, 1 масла, 12 свечей, всего: $3909.6
20:04:36 1st, 2 покрышек, 23 масла, 45 свечей, всего: $732


  • 0

#12 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 03 Январь 2011 - 00:29

surfer, да, пример твой валидный, но скорее всего, Banderas поставил неверную задачу (хотя может я не прав).
Возможно, рн решил реализовать скрипт, который будет удалять не повторяющиеся строки, а удалять строки с повторяющимся элементом в определенном столбце (Под столбцом понимается, индекс в массиве, если разбить строку по разделителю). Это то, что Димка на подобии хотел сделать для составления списка не повторяющихся запросов...
  • 0

#13 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 03 Январь 2011 - 00:37

ZiTosS думаю Banderas неправильно выбрал функцию, а именно fgetcsv()
а мы знаем:

CSV — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом — запятая (,) или точка с запятой (;).

в его тестовый файл не соответствует формату CSV

01:44:46 31st 3 покрышек 2 масла 12 свечей всего: $441.6
01:45:30 31st 12 покрышек 4 масла 34 свечей всего: $1651.2
19:45:58 1st 3 покрышек 5 масла 23 свечей всего: $530.4
19:48:39 1st 5 покрышек 34 масла 1 свечей всего: $1012.8
19:49:18 1st 32 покрышек 1 масла 12 свечей всего: $3909.6
20:01:10 1st 32 покрышек 1 масла 12 свечей всего: $3909.6
20:04:36 1st 2 покрышек 23 масла 45 свечей всего: $732

и в данном примере array_unique не найдет дублирующих записей, т.к. хотя бы время, но будет отличаться. Либо удалить первый столбец.
  • 0

#14 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 03 Январь 2011 - 01:33

Если не требуется иметь доступ к каждому элементу строки, то код surfer’а подойдет. Если же необходим доступ к каждому конкретному элементу строки, то удалить дубликаты можно так:

<?php
$fp = fopen("orders.csv", 'r');
while (!feof($fp)) {
$order[] = fgetcsv($fp);
}
fclose($fp);
// распечатываем содержимое исходного массива
echo "<pre>";
print_r ($order);
echo "</pre>";
echo "<br />=================================================================<br />";
// исходим из того, что строки абсолютно идентичны и проверяем только первый элемент каждого массива... также можем проверить и любой другой элемент
for($i = 0; $i < count($order); $i++)
{
$j = 0;
for($k = 0; $k < count($newarr); $k++)
{
if($order[$i][0] == $newarr[$k][0]) $j++;
}
if($j == 0) $newarr[] = $order[$i];
}
// распечатываем содержимое массива без дубликатов
echo "<pre>";
print_r ($newarr);
echo "</pre>";
?>


  • 0


#15 Banderas

Banderas
    Topic Starter
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 03 Январь 2011 - 12:51

Все ещё раз спасибо! Я действительно выбрал не лучший способ чтения файла. Функция fgets() прекрасно справилась со своим заданием.
Написал немного своим способом. Хотя если логично подумать, то действительно идентичных строк не будет потому что записывается время. Но и идентичны строки могут быть в магазине, возможно заказали товар, а потом другой человек заказал такое-же. Но говорить про реалистику и практические моменты с "БД" в файле неразумно. Я учусь для себя, кушаю РНР ;)

Кстати, мой код
$D_ROOT = $_SERVER['DOCUMENT_ROOT'];
$fp = fopen("$D_ROOT/../www/orders/orders.txt", 'rb');
while (!feof($fp)) {
$order[] = fgets($fp);
}
fclose($fp);

$newarr[] = array_unique($order);
foreach ($newarr as $key => $value) {
for ($i=0;$i<count($value);$i++) {
if (strlen($value[$i])>0) echo $value[$i].'<br />';
}
}


Хотя только что пришло в голову добавить поле "ИНН пользователя" и для одного пользователя два идентичны заказа убирать. Может человек случайно клацнул баблклик и форма отправилась 2 раза. Щас буду думать...
  • 0



Оформление форума – IPBSkins.ru