X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Функция fgetcsv(), принцип работы
Banderas
Banderas
Topic Starter сообщение 2.1.2011, 12:34; Ответить: Banderas
Сообщение #1


Наткнулся на функцию 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() разбивает на элементы массива часто строки, когда встречает символ, который заданный в одном из параметров функции.
Мой код программы
[php]$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 />';
}[/php]
По идеи массив $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
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
yury_mw
yury_mw
сообщение 2.1.2011, 13:41; Ответить: yury_mw
Сообщение #2


Banderas,

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

[php]while($element = each($order)) {[/php]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Banderas
Banderas
Topic Starter сообщение 2.1.2011, 13:45; Ответить: Banderas
Сообщение #3


Точно, но появилась новая ошибка. Судя по описании функции fgetcsv() переменная $order должна быть массивом. Но компилятор пишет
Warning: Variable passed to each() is not an array or object in Z:\home\test1.ru\www\vieworders.php on line 17
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
yury_mw
yury_mw
сообщение 2.1.2011, 13:50; Ответить: yury_mw
Сообщение #4


Banderas,
не знаю, у меня работает без ошибок. Ищите очепятки в коде.
[php]<?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 />';
}
?>[/php]
Вывод:
0=>20:04:36 1st
1=>2 покрышек
2=>23 масла
3=>45 свечей
4=>всего: $732
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 2.1.2011, 15:41; Ответить: matroskin8
Сообщение #5


(Banderas @ 2.1.2011, 10:34) *
В чем проблема? Что я делаю не так? И как работает функция 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]<?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]. " | ";
}
?>[/php]


Поблагодарили: (0)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Banderas
Banderas
Topic Starter сообщение 2.1.2011, 16:00; Ответить: Banderas
Сообщение #6


Матроскин, спасибо огромное! Не знал что создается вложенный массив, хотя можно было и догадаться.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 2.1.2011, 16:02; Ответить: matroskin8
Сообщение #7


Рад был помочь :)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Banderas
Banderas
Topic Starter сообщение 2.1.2011, 21:47; Ответить: Banderas
Сообщение #8


Теперь мне нужно удалить все повторяющиеся элементы массива. Знаю что для этого существует функция array_unique(). Но она не работает с многомерными массивами. Так что работать я стал с $value. Для начала код
[php] 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>';
*/
}
}[/php]
Выводит ошибку
Warning: array_unique() expects parameter 1 to be array, string given in Z:\home\test1.ru\www\vieworders.php on line 39

Хотя массив вроде числовой...
В чем проблема?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 2.1.2011, 23:08; Ответить: matroskin8
Сообщение #9


В ошибке сообщается, что параметром функции должен быть массив, но в качестве параметра оказывается строка. А конкретнее можно о повторяющихся элементах массива, а то не совсем понятно. Если хотя бы один из элементов массива встречается в другом, то весь второй массив не подходит или только его элемент? Лучше, если на примере покажешь.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Banderas
Banderas
Topic Starter сообщение 2.1.2011, 23:15; Ответить: Banderas
Сообщение #10


Например у меня есть данные в файлике
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
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Не срабатывает функция flush. Отключение буфферизации.
2 bombei 7138 3.9.2014, 22:23
автор: -Arks-
Открытая тема (нет новых ответов) функция "mysql_real_escape_string" выдаёт ошибки!
19 Panich 12637 25.5.2011, 13:57
автор: -Panich-
Открытая тема (нет новых ответов) Функция задержки
3 people2010 6679 20.8.2010, 5:37
автор: -Alcorn-


 



RSS Текстовая версия Сейчас: 19.4.2024, 16:20
Дизайн