PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wieder mal ein Array prob.


SpiderPOH
08.08.2006, 11:20:23
Ich habe wieder einmal ein problem mit einem array.

PHP Version 4.0.0

Das Array ist wiefolgt aufgebaut.


Array
(
[0] => X
[1] => X
[2] => X
[3] => X
[4] => X
[5] => X
[6] =>
[7] =>
[8] => X
[9] =>
[10] => X
)


und ich habe ein 2. array das ich irgendwie mit dem 1. abgleichen müsste


Array
(
[0] => Eier
[1] => Fisch
[2] => Wurst
[3] => Marmelade
[4] => Reis
[5] => Äpfel
[6] => Bohnen
[7] => Zitronen
[8] => Lauch
[9] => Hänchen
[10] => Bananen
)


d.h.

wenn im 1. array ein X ist soll er den passenden inhalt vom 2.array ausgeben.

in dem fall also
Eier
Fisch
Wurst
Marmelade
Reis
Äpfel
Lauch
Bananen

hat da einer ne Lösung die auch mit PHP 4.0.0 realisierbar ist ?

DominikJ
08.08.2006, 12:08:58
Hi, so sollte alles funktionieren :)
<?php
$ifs = array('X','X','X','','X','X','','','X','X');
$then = array('a','b','c','d','e','f','g','h','i','j');
$i = "0";
foreach ($ifs as $if) {
if ($if == "X") {
echo $then[$i].'<br>';
}
$i++;
}
?>

Gruß,

DominikJ

P.S.: Gibt bestimmt ne elegantere methode!



EDIT: Hier noch die ausgabe:

a
b
c
e
f
i
j

MatMel
08.08.2006, 12:27:58
<?php
$ifs = array('X','X','X','','X','X','','','X','X');
$then = array('a','b','c','d','e','f','g','h','i','j');
foreach ($ifs as $i => $if) {
if ($if == "X") {
echo $then[$i].'<br>';
}
}
?>

Durch verwendung von foreach ($ifs as $i => $if) kann man das ganze um 2 Zeilen kürzer machen... :P

DominikJ
08.08.2006, 13:06:25
Durch verwendung von foreach ($ifs as $i => $if) kann man das ganze um 2 Zeilen kürzer machen... :P

Wäre nette wenn du mir diese methode nochmal erläutern könntest!
Es funktioniert, interessiert mich nur was dat dann bedeutet :)

Opendix
08.08.2006, 13:10:53
Mit:

$i = array('key1' => 'value1', 'key2' => 'value2');
foreach($i as $key => $value)
{
echo $key . ': ' . $value;
}


dürfte folgende ausgabe geben:

key1: value1
key2: value2

kannst du durch Arrays durchiterieren wobei von jedem Element der schlüssel in $key und der wert in $value abgelegt wird!

MatMel
08.08.2006, 13:16:01
Wenn man aber beim erstellen des Arrays keine Keys angibt, werden doch automatisch Zahlen benutzt oder nicht ?

Opendix
08.08.2006, 13:22:41
ja müsste so sein!

SpiderPOH
09.08.2006, 10:26:04
supi, danke funktioniert soweit ganz gut, habe jetzt nur noch ein <table> prob.
hier der code

echo "<table><tr>";
$y=1;
foreach ($prg_inf as $i => $inf) {
if($inf == "X") {
echo "<td>".$prgmod_inf[$i]."</td>\n";
while($y == 4){
echo "</tr><tr>\n";
$y++;
}
}
}
echo "</table>";


Ich möchte ein </tr><tr> nach dem 4. "<td>".$prgmod_inf[$i]."</td>"
leider will das partu nicht klappen :(

der html Output sieht wiegfolgt aus


<td>text1</td>
</tr><tr>
</tr><tr>
</tr><tr>
<td>text2</td>
<td>text3</td>
<td>text4</td>
<td>text5</td>
<td>text6</td>
<td>text7</td>
<td>text8</td>
<td>text9</td>
</table>

mal davon abgesehn das am schluss auchnoch ein </tr> fehlt .. :(

Andes
09.08.2006, 11:23:25
Für was noch die while-Schleife? Mit if($y == 4) dürfte es funktionieren.
Für das abschließende </tr> einfach noch dieses bei </table> davor setzen.

SpiderPOH
09.08.2006, 11:43:43
hmm, das passt noch nicht ganz schaut aber schon besser aus..

html Output :
<table><tr>
<td>text1</td>
<td>text2</td>
<td>text3</td>
<td>text4</td>
</tr><tr>
<td>text5</td>
<td>text6</td>
<td>text7</td>
<td>text8</td>
<td>text9</td>
<td>text10</td>
<td>text11</td>
<td>text12</td>
<td>text13</td>
<td>text14</td>
<td>text15</td>
</tr>
</table>

Er macht nun den Umbruch nur 1x und dann nichtmehr :(

hier nochmal der neue Code


$y=1;
foreach ($prg_inf as $i => $inf) {
if($inf == "X") {
echo "<td>".$prgmod_inf[$i]."</td>\n";
if($y == 4){
echo "</tr><tr>\n";
}
$y++;
}
}

MatMel
09.08.2006, 12:15:51
Dann machst du anstelle von
$y == 4 einfach ein $y % 4 == 0.
Also immer wenn der Zähler ohne Rest durch 4 Teilbar ist, wird ein </tr><tr> gesetzt.

diver-network
09.08.2006, 12:16:42
Hi,


if (($y % 4) == 0) {
echo "</tr><tr>\n";
}


%: Modulo; vereinfacht gesagt der Rest der Division der Zahl $y durch (in diesem Fall) 4. (2 / 4 = 0 Modulo 2, 5 / 4 = 1 Modulo 1, 8 / 4 = 2 Modulo 0).

HTH,

Andy

SpiderPOH
09.08.2006, 13:31:26
super genial zu 99% passt es nur noch ein schönheitsfehler.

HTML Output :

<table>
<tr>
<td>text1</td>
<td>text2</td>
<td>text3</td>
<td>text4</td>
</tr><tr>
<td>text5</td>
<td>text6</td>
<td>text7</td>
<td>text8</td>
</tr><tr>
<td>text9</td>
<td>text10</td>
<td>text11</td>
<td>text12</td>
</tr><tr>
<td>text13</td>
<td>text14</td>
<td>text15</td>
</tr>
</table>

Das problem ist nun wenn zum schluss nur noch 3 <td>text</td> übrig sind müsste noch ein zusätzlicher <td></td> addiert werden damit die tabelle auch sauber aussieht.

Andes
09.08.2006, 14:28:07
Eine Möglichkeit wäre, dass du die Einträge mitzählst. Bei der Bedingung, die das tr-Tag setzt, setzt du den Zähler wieder auf 1.
Nach deiner Schleife prüfst du dann ob Zähler < 4 ist. Wenn ja startest du eine Schleife, die dir die restlichen td-Tags einfügt.

$y=1;
$x = 0;
foreach ($prg_inf as $i => $inf)
{
if($inf == "X") {
$x++;
echo "<td>".$prgmod_inf[$i]."</td>\n";
if($y == 4) {
echo "</tr><tr>\n";
$x = 0;
}
$y++;
}
}

if($x < 4) {
for($x; $x<4; $x++)
{
echo "<td></td>\n";
}
}

MatMel
09.08.2006, 14:36:01
Da würd ichs en bisschen abändern und zwar wie folgt:


$y=1;
foreach ($prg_inf as $i => $inf) {
if($inf == "X") {
$tempprgmod_inf[$y] = $prgmod_inf[$i];
}
}

$anz = count( $tempprgmod_inf );

for($z = 1; $z <= $anz; $z++){
if(!( ( $z-1 ) == $anz ) ){
echo "<td>".$prgmod_inf[$i]."</td>\n";
if( ($y % 4)==0 ){
echo "</tr><tr>\n";
}
}
else{
if( ($anz % 4) == 0 ){
echo"</tr>";
}
else{
$x = 4 - ($anz % 4);
for($w=1; $w<=$x;$w++){
echo"<td></td>";
}
echo " </tr>
}
}
}


Habs nich getestet ... probiers halt mal aus.

SpiderPOH
09.08.2006, 14:53:05
hmm, da passt was noch nicht genau er hat jetzt immer 4 <td></td> drann

$y=1;
foreach ($prg_inf as $i => $inf) {
if($inf == "X") {
echo "<td>".$prgmod_inf[$i]."</td>\n";
if(($y % 4) == 0){
echo "</tr>\n<tr>\n";
$x = 0;
}
$y++;
}
}
if($x < 4) {
for($x; $x<4; $x++)
{
echo "<td></td>\n";
}
}



HTML OUTPUT :


</tr><tr>
<td>text1</td>
<td>text2</td>
<td>text3</td>
<td>text4</td>
</tr>
<tr>
<td>text5</td>
<td>text6</td>
<td>text7</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>


bei text7 sieht mann das er danach anstatt nur 1x <td></td> 4 macht

Andes
09.08.2006, 15:49:41
Weil du $x nicht vor deiner ersten Schleife definiert hast und in der Schleife nicht hoch zählst.

SpiderPOH
09.08.2006, 16:26:11
hmm ich finde es einfach nicht (bin wohl blind) :(

HTML OUTPUT:

<td>text1</td>
<td>text2</td>
<td>text3</td>
<td>text4</td>
</tr>
<tr>
<td>text5</td>
<td>text6</td>
<td>text7</td>
<td>text8</td>
</tr>
<tr>
<td>text9</td>
<td>text10</td>
<td>text11</td>
<td>text12</td>
</tr>
<tr>
<td>text13</td>
<td></td>
</tr></table>


und der aktuelle Code


$x = 0;
$y = 1;
foreach ($prg_inf as $i => $inf) {
if($inf == "X") {
echo "<td>".$prgmod_inf[$i]."</td>\n";
if(($y % 4) == 0){
echo "</tr>\n<tr>\n";

}
$y++;
}
}
if($x < 4) {
if($x<4)
{
echo "<td></td>\n";
}
$x++;
}

RoSt
09.08.2006, 16:34:40
Fehlt vor dem letzten If nicht so was wie
$x = $y % 4

SpiderPOH
09.08.2006, 16:56:09
der HTML OUTPUT bleibt der selbe leider kein erfolg.

Andes
09.08.2006, 17:12:08
So sollte es aussehen

$y=1;
$x = 0; //Hier wird $x definiert
foreach ($prg_inf as $i => $inf)
{
if($inf == "X") {
$x++; //Hier wird es um 1 erhöht
echo "<td>".$prgmod_inf[$i]."</td>\n";
if($y % 4 == 0) {
echo "</tr><tr>\n";
$x = 0; //wenn Bedingung erfüllt wird $x wieder auf 0 gesetzt
}
$y++;
}
}

if($x < 4) {
for($x; $x<4; $x++)
{
echo "<td></td>\n";
}
}

RoSt
09.08.2006, 17:17:09
So sollte es doch gehen...

$x=$y % 4
if($x < 4) {
for($x; $x<4; $x++)
{
echo "<td></td>\n";
}
}

SpiderPOH
10.08.2006, 09:10:58
@Andes
Es funktioniert super NUR macht er am ende immer 4 </td></td>

HTML OUTPUT mit Andes Änderungen

</tr><tr>
<td>text5</td>
<td>text6</td>
<td>text7</td>
<td>text8</td>
</tr><tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr></table>


wenn ich den Code ergänze durch Rost seinen Vorschlag vor dem letzten IF ein $x=$y % 4; zu setzen sieht der HTML OUTPUT wiefolgt aus.


</tr><tr>
<td>text5</td>
<td>text6</td>
<td>text7</td>
<td>text8</td>
</tr><tr>
<td></td>
<td></td>
<td></td>
</tr></table>

es fehlt eigendlich ein <td></td> bzw. sind auch hier noch 3 zuviel. ;)
Ist schon ne HarteNuss das problem.

Andes
10.08.2006, 09:30:58
Dann prüf vor der Schleife ob $x > 0 ist.


if($x > 0 && $x < 4) {
for($x; $x<4; $x++)
{
echo "<td></td>\n";
}
}



Du hast dann aber noch das Problem, dass er dir überflüssige tr-Tags setzt, wenn sich die Aufteilung genau ausgeht. Das würde dann so aussehen.

</tr><tr>
<td>text5</td>
<td>text6</td>
<td>text7</td>
<td>text8</td>
</tr><tr>
</tr></table>


So werden dann auch keine überflüssige tr-Tags gesetzt.

$prg_inf = array('X','X','X','','X','X','X','X','X','X');
$prgmod_inf = array('a','b','c','d','e','f','g','h','i','j');

foreach($prg_inf as $i => $inf)
{
//Hier wird zusätzlich geprüft ob der Key bei $prgmod_inf vorhanden ist
//damit es nicht zu einer Fehlermeldung kommt, wenn die Arrays unterschiedlich groß sind
if($inf == "X" && array_key_exists($i, $prgmod_inf)) $new_array[] = $prgmod_inf[$i];
}

if(isset($new_array)) {
echo "<table><tr>\n";
$x = 0;
$y = 1;
foreach($new_array as $ausgabe)
{
$x++;
echo "<td>".$ausgabe."</td>\n";
if($y % 4 == 0 && $y < count($new_array)) {
echo "</tr><tr>\n";
$x = 0;
}
$y++;
}

if($x > 0 && $x < 4) {
for($x; $x<4; $x++)
{
echo "<td></td>\n";
}
}
echo "</tr></table>\n";
}

SpiderPOH
10.08.2006, 11:47:58
hmm schaut genial aus kann es nur nicht testen da array_key_exists erst ab PHP 4.1 Verfügbar ist. und ich hier nur 4.0.0 zur verfügung habe.

Andes
10.08.2006, 12:55:06
Dann kannst du es auch mit empty prüfen.

if($inf == "X" && !empty($prgmod_inf[$i])) $new_array[] = $prgmod_inf[$i];

SpiderPOH
10.08.2006, 14:33:32
Ich bin total von den Socken es läuft super !
MEGADICKES LOB für deine Ausdauer und Nerven.