PHP Frage zu array in array kopieren bzw. Ausgabe

Belee

Lt. Commander
Registriert
Dez. 2006
Beiträge
1.518
Hi

Gibt es eine eleganter Lösung als diese hier?

PHP:
$test = array("eins","zwei","drei","vier");
 
$ausgabe[0] = $test[0];
$ausgabe[1] = $test[1];
 
echo $ausgabe[0];
echo $ausgabe[1];

Wenn ich es so machen ...

PHP:
$ausgabe = $test[0].$test[1];
 
echo $ausgabe[0];
echo $ausgabe[1];
 
// Wird alles vertikal ausgegeben, also nur ein Buchstabe wird angezeigt.
// Verstehe nicht ganz warum (Kurzschluss).

Belee
 
In deinem zweiten Codeschnipsel schreibst du etwas in die Variable $ausgabe. Danach willst du den ersten und zweiten Eintrag aus dem Array $ausgabe ausgeben, in das zuvor aber gar nichts gespeichert wurde.
 
Hi,

bei der zweiten Version konkatenierst du die "eins" und die "zwei" und frägst dann bei der echo-Ausgabe jeweils eine Stelle ab.

Willst du mehrere Elemente ausgeben, die in einem Array stehen dann benutze eine Schleife, die genau so oft läuft wie dein Array Stellen hat und setze eine Laufvariable ein.

VG,
Mad
 
Weil im 2. Fall $ausgabe kein Array ist.

Was willst du denn gerne mit deiner Ausgabe erreichen?
 
entweder mit print_r oder mit echo implode()
PHP:
print_r($test); //sieht aber scheiße aus
echo implode("\n", $test); //gibt ne horizontale liste aus - allerdings nicht für html!

bzw. umkopieren:
PHP:
$i=0;
$ausgabe=array();
while($i<count($test)) {
   ausgabe[$i]=test[$i];
   i++;
}
 
Zuletzt bearbeitet:
Habe ich etwas Missverstandn oder gerade einen Denkfehler?
Aber ein Array lässt sich doch auch so kopieren (oder nicht?):

PHP:
# $ausgabe = array(); /* falls das helfen sollte */
$ausgabe = $test;
Aber wenn du uns den Sinn und Zweck des ganzen erklären könntest, würden wir bestimmt einer elegantere Lösung gemeinsam finden.
 
Mr. Snoot schrieb:
In deinem zweiten Codeschnipsel schreibst du etwas in die Variable $ausgabe. Danach willst du den ersten und zweiten Eintrag aus dem Array $ausgabe ausgeben, in das zuvor aber gar nichts gespeichert wurde.

Jao sehe ich auch, geht ja schlecht.

Der Sinn des ganzen ist, ich gebe derzeit an 3 Stellen jeweils 2 Zeichenketten aus, die im Falle eines Falles für alle 3 Blöcke gleich sind.
Das mache ich mit else if, nun, um diese Zeichenketten nicht 3 mal in jedem if Block zu schreiben "sind ja gleich", dachte ich ich kürze das ab und schreibe alle Meldungen in ein einziges Array und weise den Strings in den if Abfragen dann immer den passenden Block aus dem array zu.

Ich kann dabei aber nicht das Mutter array benutzen weil der Inhalt halt nicht immer der selbe ist, sonst wäre es ja einfach. Deshalb muss ich das passende aus dem Mutter Array in ein anderes array oder string kopieren und dann halt per echo $ausgabe1[0] $ausgabe1[1] , $ausgabe2[0] $ausgabe1[1] usw. ausgeben.

Das geht mit Variante 1 die ich oben gepostet habe gut nur dachte ich das man das irgendwie eleganter machen kann.

Belee
Ergänzung ()

Eagle-PsyX- schrieb:
Habe ich etwas Missverstandn oder gerade einen Denkfehler?
Aber ein Array lässt sich doch auch so kopieren (oder nicht?):

PHP:
# $ausgabe = array(); /* falls das helfen sollte */
$ausgabe = $test;
Aber wenn du uns den Sinn und Zweck des ganzen erklären könntest, würden wir bestimmt einer elegantere Lösung gemeinsam finden.

Nein, hilft nicht weil ich nicht den gesamten Inhalt des Arrays benötige und wozu sollte ich eine Kopie benötigen? :D .
In erklären bin ich leider noch schlechter als in php, ich könnte den ganzen Code hier posten, eventuell seht ihr ja dann was ich da mache.
 
Zuletzt bearbeitet:
Kann dir da nicht wirklich folgen. Wenn du Werte aus dem einen Array in ein anderes kopieren willst, um diese später ausgeben zu können, dann kannst du diese Ausgangswerte doch an den gewünschten Stellen direkt aus dem ersten Array ausgeben.

Du sagst ja, du willst "das passende aus dem Mutter Array in ein anderes array oder string kopieren". also weißt du, was das "Passende" ist - dann gib das einfach aus!?
 
Wäre sinnvoller in als PHP-Anhang hochzuladen als zu posten.
Aber mit implode() scheinst du auch nicht ganz falsch zu sein.

@Mr Snoot
I don't get it...

Wie schafft man eigentlich 21.831 Beiträge? Du bist übrigens damit dennoch nur auf Platz 4.

@Belee
Du hast nicht den Sinn und Zweck uns genannt, sondern nur das, was genau du erreichen willst (technisch) - aber nicht den Zusammenhang wieso und für was. Da lässt sich nähmlich bestimmt das ganze technische Verfahren dran ändern.
 
Zuletzt bearbeitet:
Hier der gesamte Code, das unwichtige was hiermit nix zutun hat ist raus, ich hoffe ihr versteht es jetzt.
Die Textdateien werden von einem externen Server geholt, per CronJob, jede Minute!

PHP:
<?php 
   // Diese Textdateien ändern sich ständig, sie sind auch mal für ganz 
   // kurze Zeit (paar Sekunden) leer, oder haben nur kurze Infos!
   $np1  = array_map('rtrim', file('data/np1.txt'));
   $np2  = array_map('rtrim', file('data/np2.txt'));
   $np3  = array_map('rtrim', file('data/np3.txt'));
 
   function my_sleep($seconds) { 
    $start = microtime(true); 
   for ($i = 1; $i <= $seconds; $i ++) { 
    @time_sleep_until($start + $i); 
    } 
   } 
  if(empty($np1)) {
   // Wenn also die Datei mal leer sein sollte versuche ich 2 Sekunden zu warten,
   // wenn sie dann immer noch leer ist Pech gehabt und es werden diverse Meldungen ausgegeben.
   my_sleep(2);
// lade die Textdatei dann nochmals ins Array
   $np1  = array_map('rtrim', file('/data/np1.txt'));   
  }
  if(empty($np1)) {
// Ist sie dann immer noch noch leer, gebe ich einen Text aus.
   $np1  = array('Meldung 1','Zusatz 1');
  }
// Manchmal gibt es nur ein "unbekannt" im Text, diesen überschreibe ich.
  elseif(in_array('unbekannt',$np1)) {
   $np1  = array('Meldung 2','Zusatz 2');
  } 
// dito
  elseif(in_array('wichtige - info',$np1)) {
   $np1  = array('Meldun 3','Zusatz 3');
  }
// Manchmal gibt es üöä usw.
  else {
   $np1  = array_map('htmlentities',$np1);
  }
// das selbe jetzt noch für die beiden anderen Textdateien!
// selbe Procedur.
 
  if(empty($np2)) {
   my_sleep(2);
   $np2  = array_map('rtrim', file('data/np2.txt'));
  }
  if(empty($np2)) {
   $np2  = array('Meldung 1','Zusatz 1');
  }
  elseif(in_array('unbekannt',$np2)) {
   $np2  = array('Meldung 2','Zusatz 2');
  } 
  elseif(in_array('wichtige - info',$np2)) {
   $np2  = array('Meldung 3','Zusatz 3');
  }
  else {
   $np2  = array_map('htmlentities',$np2);
  }
  if(empty($np3)) {
   my_sleep(2);
   $np3  = array('Meldung 1','Zusatz 1');
  }
  elseif(in_array('unbekannt',$np3)) {
   $np3  = array('Meldung 2','Zusatz 2');
  } 
  elseif(in_array('wichtige - info',$np3)) {
   $np3  = array('Meldung 3','Zusatz 3');
  }
  else {
   $np3  = array_map('htmlentities',$np3);
  }
// Und hier kommt dann die HTML Ausgabe, natürlich anders gestylt das ist jetzt
// nur ein Beispiel.
  echo ' <li>'.$np1[0].'<br /><span>'.$np1[1].'</span></li>'."\n";
  echo '  <li>'.$np2[0].'<br /><span>'.$np2[1].'</span></li>'."\n";
  echo '  <li>'.$np3[0].'<br /><span>'.$np3[1].'</span></li>'."\n";
 
 ?>

So, da ich finde das man das hier eleganter lösen kann suche ich nach
einer besseren Lösung. Denn wie ist seht wiederholt sich da vieles, der Code
funktioniert so wunderbar nur finde ich ist er unnötig groß.
Ergänzung ()

Mr. Snoot schrieb:
Kann dir da nicht wirklich folgen. Wenn du Werte aus dem einen Array in ein anderes kopieren willst, um diese später ausgeben zu können, dann kannst du diese Ausgangswerte doch an den gewünschten Stellen direkt aus dem ersten Array ausgeben.

Das geht nicht mein Freund, weil das erste array nicht immer auch Inhalt hat, das ist ja das Problem. Mit passend meinte ich dann meine selbst definierten Zeichenketten, aber sehe dir den Code an. Ich sagte doch, in erklären bin ich nicht so der Hit :D
Ergänzung ()

Eagle-PsyX- schrieb:
PHP:
# $ausgabe = array(); /* falls das helfen sollte */
$ausgabe = $test;

Ich glaube du hast recht und ich hatte einen Denkfehler.

Wenn ich ein Array mit meinen Zeichnketten definiere, kann ich das Mutter Array wenn es leer ist damit einfach 1:1 überschreiben.

Ich glaube das ist es, ich danke mein Herr. Erstes Problem ist gelösst jetzt noch das zweite, wie kann man den Code noch schlanker machen? Ideen?

Edit: Zu früh gefreut, das klappt zwar nur gibt es ein Problem. Ich benötige immer [0] und [1] da ich die Ausgaben so mache ansonsten müsste ich für die Ausgabe im HTML Teil nochmals mit if arbeiten und somit den Code noch großer machen. Zum davon laufen!
 
Zuletzt bearbeitet:
Wenn es nur auf einer Seite gebraucht wird und du insgesamt daran nicht viel ändern willst, dann lass es doch einfach so, solange es funktioniert...

Ansonsten erstell eine Funktion, evtl. eine ausgelagerte, dann kannst du sie ja überall einbinden. Diese kannst du dann sogar in einer Schleife auch 1000 mal oder 5000 mal ausführen lassen ;)
 
Blind runtergeschrieben, für Fehler wird nicht gehaftet und debugging gehört sowieso ausgelagert ;)

PHP:
<?php

define("PATH", "pfad/zur/datei/");
define("EXT", "txt");

function fetchFile($fileName)
{
	$fileContent = file_get_contents(PATH . $fileName . '.' . EXT);
	while(empty($fileContent))
	{
		sleep(2);
		$fileContent = file_get_contents(PATH . $fileName . '.' . EXT);
	}
	$fileContent = array_map('trim', $fileContent);
	$fileContent = array_map('htmlentities', $fileContent);
	if(in_array("unbekannt"), $fileContent)
	{
		$fileContent = array('Meldung', 'Hinweis');
	}
	elseif(in_array("wichtige - info"))
	{
		$fileContent = array('Meldung', 'Hinweis');
	}
	echo '<li>' . $fileContent[0] . '</li>';
	echo '<li>' . $fileContent[1] . '</li>';
}

?>

Das if-elseif-else-Zeugs würde ich auch noch auslagern und das ganze anfürsich sowieso in einem Objekt kapseln, aber solange Du noch über Array-Umwandlungen stolperst, überladen wir Dich lieber mal nicht mit OOP :)
 
Zuletzt bearbeitet:
Ich habs anfangs mit einer Funktion versucht, habs aber nie hinbekommen.
Ich glaube ich lasse das wirklich so, dachte halt nur das ich das irgendwie kürzen könnte, zumindest
meine Zeichenketten weil sich diese ja wie man oben sieht jeweils 3 mal wiedeholen.

Und $a = $b[0][1];

Geht ja leider nicht, wäre aber die optimale Lösung, dann könnte ich in $b alle meine Zeichenketten packen und dann jeweils die passenden ins $a schreiben, es wäre super kurz.

So geht es natürlich...
$a[0] = $b[0];
$a[1] = $b[1];

Nur ob das sauber ist steht auf einem anderen Blatt.

@philippgerard
Und das müsste ich 3 mal haben, da ich ja 3 verschiedene Textdateien habe.
Und schon bin ich da wo ich schon war + extra Bonus da ich ja auch noch paar Ifs brauche.
Hätte also nix mit gewonnen im Gegenteil, das ganze wäre zum Schluss größer.

Ich habe es schon mit Schleifen und Funktionen versucht und alle waren zum Schlus größer als
der obige Code.
 
Zuletzt bearbeitet:
Versuchs mal hiermit;)

PHP:
<?php

// $a = Dateipfad - $b = Zeitintervall von 2 Sekunden, optional änderbar
function XYZ($a, $b=2) {
	$np  = array_map('rtrim', file($a));

	if (empty($np)) {
		$start = microtime(true); 
		for ($i = 1; $i <= $b; $i++) { 
			@time_sleep_until($start + $i); 
		} 
		$np  = array_map('rtrim', file($a));
	}
	if (empty($np)) {
		$np  = array('Meldung 1','Zusatz 1');
	}
	elseif (in_array('unbekannt',$np)) {
		$np  = array('Meldung 2','Zusatz 2');
	} 
	elseif (in_array('wichtige - info',$np)) {
		$np  = array('Meldung 3','Zusatz 3');
	}
	else {
		$np  = array_map('htmlentities',$np);
	}

	return($np);
}


// Ausgabe 1 - mit Zeitintervall 2 Sekunden (welcher oben als Standard bereits festgelegt wurde.
XYZ('data/np1.txt');

// Ausgabe 2 - mit Zeitintervall 6 Sekunden (welchen man optional eingeben kann)
XYZ('data/np2.txt', 6);

// Schleife, die ein Array ausliest, in welchem sämtliche Pfade der auszulesenden Dateien enthalten sind.
$array = array('data/np1.txt', 'data/np2.txt', 'data/np3.txt', 'data/np4.txt');
for ($x = 0; $x < count($array); $x++) { 
	XYZ($array[$x]);
}

?>
 
Zuletzt bearbeitet:
Sehr schön Danke nur schaue mal ...

PHP:
 echo ' <li>'.$np1[0].'<br /><span>'.$np1[1].'</span></li>'."\n";
 echo ' <li>'.$np2[0].'<br /><span>'.$np2[1].'</span></li>'."\n";
 echo ' <li>'.$np3[0].'<br /><span>'.$np3[1].'</span></li>'."\n";

Ich benötige die Ausgabe also so...

$np1=Überschrift1 - $np1=Text1
$np2 % - $np2 %
$np3 % - $np3 %

Wie also soll ich die Funktinsausgabe einsetzen? ich kann sie nur einmal pro Zeile,
ich muss aber zwei Ausgaben pro Zeile haben. 1 Überschrift 2. Text, siehe [0] - [1]
Darum habe ich im Array ja auch "Meldung1","Zusatz1".
Meldung 1 = Überschrift , Zusatz1 = Text.

Ich muss also nochmal mit PHP ran und die Zeichketten zerlegen, und dann habe ich ein geschnippsel vom aller feinsten :D

Und die Schleife unten verstehe ich garnicht, ich habe 3 Textdateien die alle unterschiedlichen Inhalt haben, wenn sie gefüllt sind gebe ich den Inhalt genauso aus wie ich meine Zeichenketten ausgebe. Also Überschrift - Text, jeweils pro Zeile.

Trotzdem danke für deine Mühe, vll verstehe ich jetzt nur nicht wie du das genau vorhast.
 
PHP:
<?php

// $a = Dateipfad - $b = Zeitintervall von 2 Sekunden, optional änderbar
function XYZ($a, $b=2) {
    $np  = array_map('rtrim', file($a));

    if (empty($np)) {
        $start = microtime(true); 
        for ($i = 1; $i <= $b; $i++) { 
            @time_sleep_until($start + $i); 
        } 
        $np  = array_map('rtrim', file($a));
    }
    if (empty($np)) {
        $np  = array('Meldung 1','Zusatz 1');
    }
    elseif (in_array('unbekannt',$np)) {
        $np  = array('Meldung 2','Zusatz 2');
    } 
    elseif (in_array('wichtige - info',$np)) {
        $np  = array('Meldung 3','Zusatz 3');
    }
    else {
        $np  = array_map('htmlentities',$np);
    }

// Einfach nur die Ausgabe aus der Funktion verändert... Ist ganz einfach.
// Hier kannst du auch eine Komplette Tabelle erstellen, wie du halt die Ausgabe gerne hättest.
    echo($np[0].' - '.$np[1]);
}


// Ausgabe 1 - mit Zeitintervall 2 Sekunden (welcher oben als Standard bereits festgelegt wurde.
XYZ('data/np1.txt');

// Ausgabe 2 - mit Zeitintervall 6 Sekunden (welchen man optional eingeben kann)
XYZ('data/np2.txt', 6);

// Schleife, die ein Array ausliest, in welchem sämtliche Pfade der auszulesenden Dateien enthalten sind.
$array = array('data/np1.txt', 'data/np2.txt', 'data/np3.txt', 'data/np4.txt');
for ($x = 0; $x < count($array); $x++) { 
    XYZ($array[$x]);
}

?>

Zu der Schleife:
Das Array dient als Beispiel.. Ein Array ist aber Vorraussetzung für eine Schleife. Solltest du wirklich nur 3 Textdateien auslesen wollen, dann bräuchtest du keine Schleife.

Die Schleife geht praktisch alle im Array enthaltene Pfadangaben durch und führt so lange die FUnktion aus, bis alle Textdateien ausgelesen und ausgegeben sind. Das ist alles.
-- Die Funktion XYZ brauchte eine Pfadangabe zum Ort der Textdatei, damit diese Textdatei ausgelesen werden kann. In der Schleife wird über das Auslesen des Arrays die jeweilige Pfadangabe an die Funktion XYZ gegeben, so dass die Funktion ausgeführt werden kann. ;)

Verstanden?


Oder beim reurn() belassen und dann mit dem ausgegebenen Array (aus der Funktion) arbeiten...

PHP:
<?php

// $a = Dateipfad - $b = Zeitintervall von 2 Sekunden, optional änderbar
function XYZ($a, $b=2) {
    $np  = array_map('rtrim', file($a));

    if (empty($np)) {
        $start = microtime(true); 
        for ($i = 1; $i <= $b; $i++) { 
            @time_sleep_until($start + $i); 
        } 
        $np  = array_map('rtrim', file($a));
    }
    if (empty($np)) {
        $np  = array('Meldung 1','Zusatz 1');
    }
    elseif (in_array('unbekannt',$np)) {
        $np  = array('Meldung 2','Zusatz 2');
    } 
    elseif (in_array('wichtige - info',$np)) {
        $np  = array('Meldung 3','Zusatz 3');
    }
    else {
        $np  = array_map('htmlentities',$np);
    }

    return($np);
}

$Inhalt1 = XYZ('data/np1.txt');
$Inhalt2 = XYZ('data/np2.txt', 6);

// Ausgabe 1 - mit Zeitintervall 2 Sekunden (welcher oben als Standard bereits festgelegt wurde.
echo($Inhalt1[0].' - '.$Inhalt1[1]);

// Ausgabe 2 - mit Zeitintervall 6 Sekunden (welchen man optional eingeben kann)
echo($Inhalt2[0].' - '.$Inhalt2[1]);

// Schleife, die ein Array ausliest, in welchem sämtliche Pfade der auszulesenden Dateien enthalten sind.
// Erklärung zur Schleife siehe oben ;)
$array = array('data/np1.txt', 'data/np2.txt', 'data/np3.txt', 'data/np4.txt');
for ($x = 0; $x < count($array); $x++) { 
    $Inhalt = XYZ($array[$x]);
    echo($Inhalt[0].' - '.$Inhalt[1]);
}

?>
 
Zuletzt bearbeitet:
Belee, was für einen Blödsinn erzählst Du denn da? :D

Der Sinn einer Funktion ist es, sich wiederholende Elemente zusammenzufassen und sie dann aufzurufen, ohne den ganzen Inhalt der Funktion wieder programmieren zu müssen.

In diesem Fall wäre das einfach

PHP:
<?php

fetchFile('dateia.txt');
fetchFile('dateib.txt');
fetchFile('dateic.txt');

?>

Lies mal folgendes in Ruhe durch: http://tut.php-q.net/de/function.html :)
 
Ist kein Blödsinn nur versteht ihr irgendwie nicht was das Script machen soll, ich habe aber erlichgesagt keine Lust jetzt die ganze Webseite hier reinzuposten :D
Ist egal, jeder so wie er meint und es funktioniert so wie ich es gemacht habe, mit den Funktionen hier und den Vorschlägen geht das leider nicht, also nehme ich an das ihr den Sinn bzw. das was das eigentlich machen soll, nicht ganz verstanden habt, deshalb Loch , Blume rein, Wasser drüber. Trozdem danke.
 
Also beide Funktionen die dir hier angeboten wurden sollten funktionieren... Man muss sie halt nur richtig an das eigene Skript anpassen ;)
 
Zurück
Oben