2015-08-03 2 views
1

Попытка создать класс php для импорта CSV-данных. Извините за беспорядочно выглядящие коды. Я создал функцию _santitize_product_list() для фильтрации через файл CSV, разделяющего данные продукта, которые передают требования к импорту и данные о продуктах, которые что-то не хватает. Функция работает нормально, если:почему list() не работает в моем случае

$this->_sanitized_data = $this->_sanitize_product_list($this->_csv_data); 

Чтобы получить массив, содержащий обе группы. Если я хочу, чтобы разделить их, я пытаюсь использовать list():

list($this->_sanitized_data, $this->_error_list) = $this->_sanitize_product_list($this->_csv_data); 

на этот раз код возвращает неопределенное значение смещения: 1 ошибка. Мой вопрос: почему list() не работает в этом случае?

class data_import_update { 
    protected $_dbc; 
    protected $_update; 
    protected $_total_line; 
    protected $_csv_data; 
    protected $_sanitized_data; 
    protected $_error_list; 
    protected $_update_list; 
    protected $_import_list; 

    // constructor 
    // plug in DB connection 
    function __construct($csv_data) { 

     $this->_csv_data = $csv_data; 

     // step1. fiter the input data 

     //list($this->_sanitized_data, $this->_error_list) = $this->_sanitize_product_list($this->_csv_data); 
     $this->_sanitized_data = $this->_sanitize_product_list($this->_csv_data); 
    } // End of Constructor 

    // filter out items that no meet requirement 
    private function _sanitize_product_list ($list_input) { 
     $err_item = array(); 
     foreach ($list_input as $key => $item) { 
      //require fields: product_sku, product_name, product_unit, product_packaging, category, file_url, slash in the category 
      //make sure each item required fields aren't left empty 
      // || empty($item['file_url']) empty($item['product_name']) || empty($item['product_packaging']) || 
      if (empty($item['product_sku']) || (empty($item['category']) || !strpos($item['category'], '/'))) { 

       // log error item and unset it from import list 
       $err_item[] = $list_input[$key]['product_sku']; 
       unset($list_input[$key]); 
      } 
     } // End of foreach loop 

     if (!empty($err_item[0])) { 
      return array('import_list'=>$list_input, 'error_item'=>$err_item); 
     }else { 
      return array('import_list'=>$list_input); 
     } 
    } 
+0

В вашем 'else', когда вы' возврат массива («import_list» => $ list_input), 'есть только один элемент, индекс 0 и не элемент с индексом 1, но вы указали 'list()' два vars для заполнения. – AbraCadaver

+0

возвращаемый выходной массив как это: Массив ( [import_list] => Массив ( [3] => Массив ( [публиковать] => 1 [product_sku] => BX4721 -BK .... ..... ) [error_item] => Массив ( [0] => BX3856 [1] => BX4711-MX [2] => BX3856 ) ) –

+0

'if' на end иногда возвращает массив с 2 элементами, иногда только 1. – Barmar

ответ

2

list() работает только с числовыми массивами, а не с ассоциативными массивами, поскольку он присваивает первую переменную от $array[0], вторую переменную от $array[1] и так далее. Вам также нужно возвращать 2 элемента все время. Таким образом, изменение if в конце концов просто:

return array($list_input, $err_item); 
+0

спасибо, Бармар. Это отвечает моему вопросу –

4

Ваш, если проверка на $err_item есть условие еще, что только возвращает один элемент в массиве. Я могу только предположить, что ваш код попадает в это условие возврата, поэтому ваш вызов list() не будет использовать второй параметр.

+0

спасибо Абра, я изменю код. –

Смежные вопросы