php8: while list each
bearbeitet von
Hallo,
ich bin grad etwas unsicher, ob ich diesen Thtread weiter nutzen sollte oder einen neuen aufmachen soll. Da es sich aber weiterhin um ein Problem im Rahmen der Umstellung auf php8 handelt, mache ich mal einen weiteren "Subthread" auf.
Es geht darum, dass ich nicht genau weiß, wie die (ehemalige) each()-Funktion genau arbeitet und was man anstattdessen ab php 8 benutzt.
Ich habe selber nur wenige Stellen in meiner Anwendung., wo ichs benutzt habe, aber eben doch eine Hand voll.
~~~
while(list($file,$info)=each($this->images)) {
...
}
~~~
Wenn ich das korrekt erinnere, geht while eine Liste von Arrays durch und each (oder list) teilt die Arrayelemente dann auf die beiden list-Parameter auf?
Würde ich das in php8 dann so umarbeiten?
~~~ PHP
foreach($this->images AS $file=>$info){
~~~
Und was ich auch nie ganz verstanden habe, ist, ob diese alte Funktion auch mehr als 2 Parameter hätte haben dürfen und wie man das dann ab php8 ersetzen würde. (Nur ganz allgemein gefragt, meine Handvoll Beispiele, in denen ichs ändern muss, haben alle nur 2 Parameter)
Gruß, Jörg
Hier mal die komplette Methode, aus der dieses beispiel entnommen ist.
~~~ PHP
function _putimages()
{
$filter=($this->compress) ? '/Filter /FlateDecode ' : '';
reset($this->images);
while(list($file,$info)=each($this->images))
{
$this->_newobj();
$this->images[$file]['n']=$this->n;
$this->_out('<</Type /XObject');
$this->_out('/Subtype /Image');
$this->_out('/Width '.$info['w']);
$this->_out('/Height '.$info['h']);
if($info['cs']=='Indexed')
$this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]');
else
{
$this->_out('/ColorSpace /'.$info['cs']);
if($info['cs']=='DeviceCMYK')
$this->_out('/Decode [1 0 1 0 1 0 1 0]');
}
$this->_out('/BitsPerComponent '.$info['bpc']);
if(isset($info['f']))
$this->_out('/Filter /'.$info['f']);
if(isset($info['parms']))
$this->_out($info['parms']);
if(isset($info['trns']) && is_array($info['trns']))
{
$trns='';
for($i=0;$i<count($info['trns']);$i++)
$trns.=$info['trns'][$i].' '.$info['trns'][$i].' ';
$this->_out('/Mask ['.$trns.']');
}
$this->_out('/Length '.strlen($info['data']).'>>');
$this->_putstream($info['data']);
unset($this->images[$file]['data']);
$this->_out('endobj');
//Palette
if($info['cs']=='Indexed')
{
$this->_newobj();
$pal=($this->compress) ? gzcompress($info['pal']) : $info['pal'];
$this->_out('<<'.$filter.'/Length '.strlen($pal).'>>');
$this->_putstream($pal);
$this->_out('endobj');
}
}
}
~~~
php8: Fatal error: Uncaught Error: Undefined constant "int" in...
bearbeitet von JörgHallo,
ich bin grad etwas unsicher, ob ich diesen Thtread weiter nutzen sollte oder einen neuen aufmachen soll. Da es sich aber weiterhin um ein Problem im Rahmen der Umstellung auf php8 handelt, mache ich mal einen weiteren "Subthread" auf.
Es geht darum, dass ich nicht genau weiß, wie die (ehemalige) each()-Funktion genau arbeitet und was man anstattdessen ab php 8 benutzt.
Ich habe selber nur wenige Stellen in meiner Anwendung., wo ichs benutzt habe, aber eben doch eine Hand voll.
~~~
while(list($file,$info)=each($this->images)) {
...
}
~~~
Wenn ich das korrekt erinnere, geht while eine Liste von Arrays durch und each (oder list) teilt die Arrayelemente dann auf die beiden list-Parameter auf?
Würde ich das in php8 dann so umarbeiten?
~~~ PHP
foreach($this->images AS $file=>$info){
~~~
Und was ich auch nie ganz verstanden habe, ist, ob diese alte Funktion auch mehr als 2 Parameter hätte haben dürfen und wie man das dann ab php8 ersetzen würde. (Nur ganz allgemein gefragt, meine Handvoll Beispiele, in denen ichs ändern muss, haben alle nur 2 Parameter)
Gruß, Jörg
Hier mal die komplette Methode, aus der dieses beispiel entnommen ist.
~~~ PHP
function _putimages()
{
$filter=($this->compress) ? '/Filter /FlateDecode ' : '';
reset($this->images);
while(list($file,$info)=each($this->images))
{
$this->_newobj();
$this->images[$file]['n']=$this->n;
$this->_out('<</Type /XObject');
$this->_out('/Subtype /Image');
$this->_out('/Width '.$info['w']);
$this->_out('/Height '.$info['h']);
if($info['cs']=='Indexed')
$this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]');
else
{
$this->_out('/ColorSpace /'.$info['cs']);
if($info['cs']=='DeviceCMYK')
$this->_out('/Decode [1 0 1 0 1 0 1 0]');
}
$this->_out('/BitsPerComponent '.$info['bpc']);
if(isset($info['f']))
$this->_out('/Filter /'.$info['f']);
if(isset($info['parms']))
$this->_out($info['parms']);
if(isset($info['trns']) && is_array($info['trns']))
{
$trns='';
for($i=0;$i<count($info['trns']);$i++)
$trns.=$info['trns'][$i].' '.$info['trns'][$i].' ';
$this->_out('/Mask ['.$trns.']');
}
$this->_out('/Length '.strlen($info['data']).'>>');
$this->_putstream($info['data']);
unset($this->images[$file]['data']);
$this->_out('endobj');
//Palette
if($info['cs']=='Indexed')
{
$this->_newobj();
$pal=($this->compress) ? gzcompress($info['pal']) : $info['pal'];
$this->_out('<<'.$filter.'/Length '.strlen($pal).'>>');
$this->_putstream($pal);
$this->_out('endobj');
}
}
}
~~~