@yooooooman

Как устранить ошибку fputcsv expect parametr 1?

Доброго времени суток!

Есть скрипт

spoiler
<?php

$file = file('../csv/file1.csv');
$file2 = file('../csv/file2.csv');

//Названия столбцов
$name_column_table = str_replace(array("\r","\n"),"",explode(";", $file[0]));
unset($file[0]);
$name_column_table_**** = str_replace(array("\r","\n"),"",explode(";", $file2[0]));
unset($file2[0]);
//массив со значениями из которого будем брать данные для замены
$bbb = array();
foreach($file2 as $k => $pre_array_values_products_****){
$array_values_products_**** = str_replace(array("\r","\n"),"",explode(";", $pre_array_values_products_****));
$product_**** = array_combine($name_column_table_****, $array_values_products_****);
$bbb[] = $product_****;
}
//Мой массив
$array_for_yml = array();
foreach($file as $k => $pre_array_values_products){
$array_values_products = str_replace(array("\r","\n"),"",explode(";", $pre_array_values_products));
$product = array_combine($name_column_table, $array_values_products);
$array_for_yml[] = $product;
}
//Создаем новый массив только с неповторяющимися артикулами
$artikuls = [];

foreach ($array_for_yml as $index => $item) {
//echo"";
//print_r($item['Артикул ****']);
$id = $item['ID товара'];
if (!in_array($item['Артикул ****'], $artikuls)) {$artikuls[$id] = $item['Артикул ****'];}
asort($artikuls);
}

//print_r($artikuls);

//УДАЛЯЕМ МАССИВЫ В КОТОРЫХ НЕТ АРТИКУЛОВ ИЗ МОЕГО МАССИВА
foreach ($bbb as $key => $value) { if (!in_array($value['Артикул'], $artikuls)) { unset($bbb[$key]);} }
//Создаем новый массив только с артикулами из моего массива
$newarray = $bbb;

//print_r($newarray);

//Очищаем
unset ($bbb, $file1, $file2, $name_column_table, $name_column_table_****);
//Конечный массив и запись
foreach($array_for_yml as $k => $arr){
echo"";
$x = $arr['Артикул ****'];
$fff = array_filter($newarray, function($v) use ($x) { return $v["Артикул"] == $x;});
foreach($fff as $fg){
if ($fg['старая РРЦ/МРЦ, руб'] !== '') { $arr['Старая цена'] = $fg['старая РРЦ/МРЦ, руб'];} else {$arr['Старая цена'] = '';}
if ($fg['На складе хранения, шт'] !== '') { $arr['Дальний склад **** (COUNT)'] = $fg['На складе отгрузки, шт']+$fg['На складе хранения, шт'];} else {$arr['Дальний склад **** (COUNT)'] = '';}
if ($fg['РРЦ/МРЦ, руб'] !== '') { $arr['Цена **** (PRICE)'] = $fg['РРЦ/МРЦ, руб'];} else {$arr['Цена **** (PRICE)'] = '';}
}
$end_massiv[] = $arr;
//Очищаем
unset ($array_for_yml);
//Записываем в CSV
$header=null;
$file_for_yml = fopen('../csv_for_loading/file_for_yml2.csv',"w+");
foreach ($end_massiv as $row) {
if(!$header) {
fputcsv($file_for_yml,array_keys($row), ';');
fputcsv($file_for_yml, $row, ';'); // do the first row of data too
$header = true;
}
else {fputcsv($file_for_yml, $row, ';');}
}
fclose($file_for_yml);
}

?>


Короткая суть скрипта такая:

Есть 2 файла с товарами с уникальными артикулами. В одном файле 18000+ товаров, в другом 100000+ товаров. Массив из файла где товаров больше укорачиваем посредством !in_array и unset (т.е удаляем все артикулы, которых нет в файле 1) - сделано это для ускорения процесса прохода и сравнения по массивам. Далее в массивах (файл 1) заменяем 3 элемента каждого товара (наличие, старая цена, цена) на значения из нового созданного массива. Полученный массив записываем в новый файл csv. Может быть конечно есть более элегантное и быстрое решение этого, но я другого ничего не смог придумать, познаний в php немного...

Вопрос следующий. Если скрипт выполняется на локальном сервере на ноутбуке с оперативной памятью 8 гб, то получаю ошибки:

: fopen(../csv_for_loading/file_for_yml2.csv): failed to open stream: Invalid argument in on line
: fputcsv() expects parameter 1 to be resource, boolean given in on line
: fputcsv() expects parameter 1 to be resource, boolean given in on line
: fputcsv() expects parameter 1 to be resource, boolean given in on line

Если скрипт выполняется на локальном сервере на рабочем компьютере с большей оперативной памятью (не могу сказать сколько, ибо не помню и сейчас его нет под рукой), то все выполняется безошибочно.

Скрипт съедает память или как это можно еще объяснить? Как сделать так, чтобы скрипт выполнялся везде одинаково и безошибочно не зависимо от памяти?
  • Вопрос задан
  • 396 просмотров
Пригласить эксперта
Ответы на вопрос 1
@santaatnas
Java, Python, Php
php.net/manual/ru/function.fopen.php Почитайте внимательно описание функции. Особенно пункт "Возвращаемые значения" - Возвращает указатель на файл в случае успешной работы, или FALSE в случае ошибки. Ваша ошибка как раз и говорит, что у fopen сработал с ошибкой и вернул false. Смотрите путь к файлу, у вас он относительный прописан. Думаю дело не в памяти.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы