Перебор в цикле строк из файла PHP

218
28 октября 2018, 13:20

подскажите пожалуйста, необходимо сделать цикл, который будет проверять определенный столбец передаваемого файла с условием, есть ли в данном столбце значение больше 0.

То есть приходит файл, там идут значения 0 0 0 1 видит 1, значит все нормально, гружу данные в БД

если приходит файл со значениями 0 0 0 0 то данные в БД не загружаю.

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

function upload($p_file){
$uploaddir = './load/';
 // yyyy/mm/dd
 $uploaddir .= date('Y/n/d/');
 mkdir($uploaddir, 0777, true);
 $uploadfile = $uploaddir . date("dmYHis", time()) . '_' . rnd(10) . '_' . basename($p_file['name']);
 if (move_uploaded_file($p_file['tmp_name'], $uploadfile)) {
 } else {
  $error_string = "Не могу скопировать файл в load директорию";
  $error = true;
  return;
 }
 $file_name = $uploadfile;
 $csv = array();
 $f = fopen($file_name, "rt");
 while (($buffer = fgets($f, 10000)) !== false) {
  $buffer = trim($buffer,"\n\r");
  $data = str_getcsv($buffer,";");
  $csv[] = $data;
 }
 fclose($f);
$sql = "call web_t(?)";
    $stmt = mysqli_prepare($page->mysqli_handle, $sql);
    foreach($csv as $key => $csv_row){
        if($key > 0)
 {
            $clm = floatval(str_replace(',', '.', $csv_row[3]));
if($clm == 0)
        {
            $error_string = "Все данные равны нулю";
            $error = true;
            return;
        }
// грузим в базу.
mysqli_stmt_bind_param($stmt, 'd', $clm);
            $result = mysqli_stmt_execute($stmt);
            if ($result == false)
            {
                $error_string = "ERROR[web_t($key)]: " . mysqli_error($page->mysqli_handle);
                $error = true;
                return;
            }
        }
    }

А необходимо чтобы весь файл проверяло на значение больше нуля, если есть хоть одно значение больше 0, тогда данные загружаем.

Если есть варианты как это реализовать без цикла, тоже приветсвуется.

Answer 1
$num = "0101";
$len = strlen($num);
for($i = 0; $i < $len; $i++){
    if($num[$i] > 0 ){
        $exist = true;
        break;
    }
}
if($exist) echo "была найдена единица";

Если неподходит то напишите и я поправлю

Answer 2

Надеюсь, правильно вас понял.

$array = array(0, 0, 1, 0); //Пришедшие данные
foreach($array as $key => $value) { //Идем по массиву
    if($value) { //Если текущее значение не ноль. Учтите, если придет отрицательное число, то условие выполнится; если Вас это не устраивает - используйте ($value > 0)
        //Здесь используйте код для загрузки массива на сервер
        break;
    }
}

Попробуйте так:

function upload($p_file) {
    $uploaddir = './load/';
    $uploaddir .= date('Y/n/d/');
    mkdir($uploaddir, 0777, true);
    $uploadfile = $uploaddir . date("dmYHis", time()) . '_' . rnd(10) . '_' . basename($p_file['name']);
    if(!move_uploaded_file($p_file['tmp_name'], $uploadfile)) {
        $error_string = "Не могу скопировать файл в load директорию";
        $error = true;
        return;
    }
    $csv = null;
    $f = fopen($file_name, "rt");
    while (($buffer = fgets($f, 10000)) !== false) {
        $buffer = trim($buffer,"\n\r");
        $data = str_getcsv($buffer,";");
        $csv += $data;
    }
    fclose($f);
    $sql = "call web_t(?)";
    $stmt = mysqli_prepare($page->mysqli_handle, $sql);
    for($i = 0; $i < strlen($csv); i++) {
        if($csv[i] > 0) {
            mysqli_stmt_bind_param($stmt, 'd', $csv);
            if(!mysqli_stmt_execute($stmt)) {
                $error_string = "ERROR[web_t($key)]: " . mysqli_error($page->mysqli_handle);
                $error = true;
                return;
            }
        }
    }
    $error_string = "Все данные равны нулю";
    $error = true;
    return;
}
Answer 3

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

function check_zeros($p_csv){
    foreach ($p_csv as $row ) {
        if($row[3] != 0)
        {
            return true;
        }
        if($row[5] != 0)
        {
            return true;
        }
    }
    return false;
}

И далее я ее вызываю с проверкой на false.

if(check_zeros($csv) == false)
{
    $error_string = "Все значения равны нулю";
    $error = true;
    return;
}

Выходит то, что мне требовалось, если есть значения больше нуля, то все нормально, файл проходит проверку и загружается.

READ ALSO
Проблема с поиском в массиве [закрыт]

Проблема с поиском в массиве [закрыт]

Есть скрипт обработки данных которые пришли от игры

197
ajax и checkbox

ajax и checkbox

Есть отдельный input:

160
PHP Laravel, а точнее @component

PHP Laravel, а точнее @component

Появилась проблема, вовремя обучения Laravel у меня появилась проблема которую не могу разобрать, прошу посмотреть: `

206
Как сделать фабрику для модели с полиморфной связью?

Как сделать фабрику для модели с полиморфной связью?

Есть модели Рецепт и Пост - commentable, и модель Комментарии с полиморфной связьюПодскажите, как в случае полиморфных связей создать фабрику для...

168