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

Реферальная программа Мегаплана

Партнерская программа Kredov

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

Функция fgetcsv()

#1 Banderas

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

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

Наткнулся на функцию fgetcsv() и захотел попрактиковаться на файле orders.txt
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

Насколько я понял, функция fgetcsv() разбивает на элементы массива часто строки, когда встречает символ, который заданный в одном из параметров функции.
Мой код программы
$D_ROOT = $_SERVER['DOCUMENT_ROOT'];
$fp = fopen("$D_ROOT/../www/orders/orders.txt", 'rb');
while (!feof($fp)) {
$order = fgetcsv($fp, 1024, "\t");
}

fclose($fp);

while($element = $each($order)) {
echo $element['key'].'=>';
echo $element['value'].'<br />';
}

По идеи массив $order должен заполнятся таким способом: $order = array("01:44:46 31s", "01:45:30 31st", "19:45:58 1st", ...). Значит ключ для первого равен нуля (0), для второго единицы (1) и так далее. Но в результате компилятор показывает ошибку:

Fatal error: Function name must be a string in Z:\home\test1.ru\www\vieworders.php on line 17

В чем проблема? Что я делаю не так? И как работает функция fgetcsv()?

 

 

  • 0


#2 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

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

Banderas,
в строке
while($element = $each($order)) {
лишний $, правильно так:
while($element = each($order)) {

  • 0

#3 Banderas

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

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

Точно, но появилась новая ошибка. Судя по описании функции fgetcsv() переменная $order должна быть массивом. Но компилятор пишет

Warning: Variable passed to each() is not an array or object in Z:\home\test1.ru\www\vieworders.php on line 17


  • 0


#4 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

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

Banderas,
не знаю, у меня работает без ошибок. Ищите очепятки в коде.
<?php
$fp = fopen("orders.txt", 'rb');
while (!feof($fp)) {
$order = fgetcsv($fp, 1024, "\t");
}

fclose($fp);

while($element = each($order)) {
echo $element['key'].'=>';
echo $element['value'].'<br />';
}
?>

Вывод:

0=>20:04:36 1st
1=>2 покрышек
2=>23 масла
3=>45 свечей
4=>всего: $732


  • 0

#5 matroskin8

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

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

В чем проблема? Что я делаю не так? И как работает функция fgetcsv()?

Функция читает строку из файла и по своей работе аналогична функции fgets(), с той разницей, что предназначена для работы с файлами csv (но работает и с txt).
А что мы должны получить в итоге? Просто массив строк или массив какого-то элемента строк?
Можно получить и то, и другое - только поставить разделители в считываемом файле:
orders.csv или orders.txt:
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
index.php:
<?php
$fp = fopen("orders.txt", 'r');
while (!feof($fp)) {
$order[] = fgetcsv($fp);
}
fclose($fp);
// распечатываем содержимое массива
echo "<pre>";
print_r ($order);
echo "</pre>";

// распечатываем нужный элемент массива, например, 1-ый элемент каждой строки
for($i = 0; $i < count($order); $i++)
{
echo $order[$i][0]. " | ";
}
?>

  • 0


#6 Banderas

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

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

Матроскин, спасибо огромное! Не знал что создается вложенный массив, хотя можно было и догадаться.
  • 0


#7 matroskin8

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

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

Рад был помочь :)


  • 0


#8 Banderas

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

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

Теперь мне нужно удалить все повторяющиеся элементы массива. Знаю что для этого существует функция array_unique(). Но она не работает с многомерными массивами. Так что работать я стал с $value. Для начала код
		foreach ($order as $key => $value){
for ($i=0;$i<count($value);$i++) {
$newarr = array_unique($value[$i]);

/*
echo '<pre>';
print_r ($value[$i]);
echo '</pre>';
*/
}
}

Выводит ошибку

Warning: array_unique() expects parameter 1 to be array, string given in Z:\home\test1.ru\www\vieworders.php on line 39

Хотя массив вроде числовой...
В чем проблема?
  • 0


#9 matroskin8

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

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

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


#10 Banderas

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

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

Например у меня есть данные в файлике
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
Из них два идентичны. Мне нужно что бы удаляло из массива только идентичные элементы, тоесть что бы в массиве после работы функции остались такие элементы
19:48:39 1st, 5 покрышек, 34 масла, 1 свечей, всего: $1012.8
20:01:10 1st, 32 покрышек, 1 масла, 12 свечей, всего: $3909.6
20:04:36 1st, 2 покрышек, 23 масла, 45 свечей, всего: $732

  • 0


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


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