2010-05-28 3 views
3

Я использую класс, который возвращает мне значение конкретной строки и ячейки таблицы Excel. Чтобы создать массив из одного столбца, я подсчитываю строки и затем перебираю это число с помощью цикла for(), а затем используя $array[] = $value, чтобы установить значение возрастающего объекта массива.PHP: проверьте, 0?

Это отлично работает, если ни одно из значений в ячейке не равно 0. Класс возвращает мне число 0, так что это не имеет никакого отношения к классу, я думаю, что это то, как я перебираю строки, а затем назначая их массиву ... Я хочу переносить значение 0, потому что я создаю графики с данными впоследствии, вот код, который у меня есть.

// Get Rainfall 
$rainfall = array(); 
for($i=1;$i<=$count;$i++) 
{ 
    if($data->val($i,2) != 'Rainfall') // Check if not the column title 
    { 
     $rainfall[] = $data->val($i,2); 
    } 
} 

Для вашей информации $data является объектом таблицы Excel и метод $data->val(row,col) является то, что возвращает мне значение. В этом случае я получаю данные из столбца 2.

Screenshot of spreadsheet

+2

Попробуйте использовать var_dump() и print_r() в массиве данных. Эти отличные функции очень полезны для отладки! –

+0

Что происходит, когда 0 найден? – Tommy

+0

@John Я сделал так, вот почему я смущен. У меня есть 30 строк в файле excel, и когда я делаю print_r в массиве, я получаю только значения, которые не равны 0 .. поэтому он игнорирует 0 – tarnfeld

ответ

4

ли вы попробовать array_push()?

array_push($rainfall, $data->val($i,2)); 
+0

YYESS !!! THANKSS YOOO! – tarnfeld

+1

Я действительно удивлен здесь. array_push() работает, но $ array [] = $ var; не? На самом деле, array_push() для одной переменной - это не что иное, как $ array [] = $ var; Я думал? – Max

3

Я хотел бы использовать строгое сравнение с оператором not identical здесь вместо использования не равен оператору:

if($data->val($i,2) !== 'Rainfall') 

Если $data->val($i,2) является целым числом, и вы используете == обе стороны будут cast to integers, который даст вам результат, что все целые числа будут работать так, как вы ожидаете, кроме нуля. Вот краткое описание разницы между == и === при сравнении строки «ДОЖДЕВОМ» с нуля:

0 == "RainFall" : true 
0 != "RainFall" : false 
0 === "RainFall" : false 
0 !== "RainFall" : true 
+0

Не работает ли PHP с 0s и сравнениями, то есть он обрабатывает 0 как false вместо целого числа в определенных ситуациях? Кажется, я видел это где-то раньше ... – Tommy

+0

Да. Но это задокументировано: http://www.php.net/manual/en/types.comparisons.php – Arkh

1

Я думаю, что массив обрабатывает 0 как ложное, что может объяснить, что он не входит в массив. Будет что-то вроде этой работы (если вы используете целые числа)?

(int)($data->val($i,2)); 

или

(float)($data->val($i,2);) 
0

Проблема заключается в том, если заявление. Вы пытаетесь сравнить строку с целым числом, которое, согласно документации PHP, будет выглядеть как для целых чисел.

Если вы сравниваете число со строкой или сравниваете числовые строки, то каждая строка преобразуется в число и выполняется сравнение численно. Эти правила также применяются к оператору switch. Преобразование типа не происходит, когда сравнение === или! ==, поскольку это предполагает сравнение типа, а также значения.

Здесь вы можете прочитать здесь http://php.net/manual/en/language.operators.comparison.php.

Обновление: если оператор не будет работать в случае 0 потому (int)"Rainfall" воли typecasted в 0 РНР вызывает утверждение быть if (0 != 0) { ... }.

Если $i представляет номер строки, почему бы вам не начать с 2 вместо 1?

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