Я получаю действительно странный вывод от одного из моих классов, здесь:
class group
{
public $myArray = array(); // an array of fraction objects
// find the smallest fraction
private function smallest()
{
$result = array('num'=>NULL, 'den'=>NULL); // this is what is returned
// initialize temp variables
$fractionObj = reset($this->myArray); // pointer to first element of array
while($fractionObj->dropped == 1)
{
$fractionObj = next($this->myArray); // move the pointer ahead until finding a fraction that is not already dropped. RESULTS IN 'Notice: Trying to get property of non-object' ERROR on this line
}
$decimal = ($fractionObj->numerator/$fractionObj->denominator); // initialized to the first fraction value that is not dropped
$result['num'] = $fractionObj->numerator;
$result['den'] = $fractionObj->denominator;
$lowest = $fractionObj;
foreach($myArray as $a)
{
if($a->dropped == 0 && $a->numerator/$a->denominator < $decimal)
{
$decimal = $a->numerator/$a->denominator;
$result['num'] = $a->numerator;
$result['den'] = $a->denominator;
$lowest->dropped = true; // mark this value as dropped so it is ignored for the next call to smallest()
}
}
return $result;
}
}
class fraction
{
public $numerator;
public $denominator;
public $dropped = false;
}
У меня есть групповой класс, который содержит массив объектов класса дроби. Когда создается новый групповой объект, он создается с размещением дробей в массиве, и все это работает нормально.
Я пытаюсь найти x количество наименьших дробей (на основе их десятичного значения) и пометить наименьшие из них как «отброшенные», что означает, что они все еще останутся в массиве, но мы их проигнорируем. Вот что указывает переменная $ drop в классе дроби. Я делаю это с помощью цикла, который вызывает функцию smalllest ()
Проблема в том, что я получаю уведомление, что пытаюсь получить свойство необъекта, т.е. Тем не менее, если я var_dump ($actionObj), он говорит мне, что это объект. Есть ли способ продвинуть указатель массива на следующий объект в массиве без использования next (), так как я думаю, что это проблема.
Мне удалось решить с помощью следующего решения. Я уверен, что есть лучшие способы. Было бы действительно удобно иметь возможность перебирать с помощью next (), но я думаю, что это не работает интуитивно с объектами.
class group
{
public $myArray = array(); // an array of fraction objects
// find the smallest fraction
private function smallest()
{
$result = array('num'=>NULL, 'den'=>NULL); // this is what is returned
foreach($this->myArray as $a)
{
if($a->dropped == false)
{
if(!isset($val))
{
$val = $a->percent();
$lowest = $a;
$result['num'] = $a->nominator;
$result['den'] = $a->denominator;
}else{
if($a->percent() < $val)
{
$val = $a->percent();
$lowest = $a;
$result['num'] = $a->nominator;
$result['den'] = $a->denominator;
}
}
}
}
$lowest->drop();
return $result;
}
}
class fraction
{
public $numerator;
public $denominator;
public $dropped = false;
public function percent()
{
return $this->numerator/$this->denominator;
}
public function drop()
{
$this->dropped = true;
}
}
Других решений пока нет …