Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 12. Juni 2015 19:15

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 604

[GELÖST] PHP - Aufwändiges Suchen und Ersetzen

Hallo zusammen,

ich hoffe, die Bastelstube ist ok für eine reine PHP-Frage, unabhängig von CMSms.

Folgende Situation:
Ein Dropdown (select) wird aus einem Array zusammen gesetzt. Nun sollen die einzelnen Optionen durch andere Werte ersetzt werden.
Das Dropdown sieht im Frontend so aus (Beispiel):

[== HTML ==]
<select>
	<option>a</option>
	<option>b</option>
	<option>c</option>
	<option>d</option>
</select>

Zusammengesetzt wird es so:

[== PHP ==]
<select onchange="setLocation(this.value)">
	<?php foreach ($this->getItems() as $_item): ?> 
	<option><?php echo $_item->getLabel() ?></option>
	<?php endforeach; ?> 
</select>

Jetzt sollen die jeweiligen Optionen (a-d) anhand einer Tabelle bzw. CSV-Datei ausgetauscht werden (a=1, b=2 usw.).
Dafür lese ich eine entsprechende CSV-Datei ein und erhalte folgenden Array:

Array
(
    [0] => Array
        (
            [0] => a
            [1] => 1
        )

    [1] => Array
        (
            [0] => b
            [1] => 2
        )

    [2] => Array
        (
            [0] => c
            [1] => 3
        )

    [3] => Array
        (
            [0] => d
            [1] => 4
        )
)

Mit meinem naiven Grundwissen in PHP würde ich mir jetzt wünschen, dass es eine Funktion gibt, die $_item->getLabel() gegen den Array aus der CSV-Datei prüft und bei Erfolg den entsprechenden Gegenwert wählt.

Ich habe mir schon str_replace, str_ireplace, substr_replace und strtr angeschaut wobei mir str_replace am sinnvollsten erscheint. Allerdings finde ich natürlich genau diesen Anwendungsfall dort nicht bzw. nur in die andere Richtung - oder ich bin nur zu blind.

Um Fragen zuvor zu kommen - es gibt in dem Fall leider keine andere Möglichkeit, die Werte schon im Vorfeld zu ändern, da sie aus einer Datenbank kommen, in denen sie mit a-d gespeichert sein müssen, nun aber mit 1-4 ausgegeben werden sollen.
In der Realität handelt es sich dabei um interne und externe Artikelnummern mit unterschiedlichen Zeichen, es kommen Punkte, Bindestriche, Buchstaben und Zahlen vor.

Es gibt sicher viele viele PHP-Foren, aber hier habe ich einfach die beste Erfahrung gemacht und hoffe deshalb auf Hilfe oder Tipps :-)

Offline

#2 13. Juni 2015 22:53

cyberman
Moderator
Ort: Dohna / Sachsen
Registriert: 13. September 2010
Beiträge: 6.878
Webseite

Re: [GELÖST] PHP - Aufwändiges Suchen und Ersetzen

jeff1980 schrieb:

In der Realität handelt es sich dabei um interne und externe Artikelnummern mit unterschiedlichen Zeichen, es kommen Punkte, Bindestriche, Buchstaben und Zahlen vor.

Ähmm, kann es sein, dass du es dir unnötig schwer machst? Wozu ein replace?

<select>
	<option value="1">a</option>
	<option value="2">b</option>
	<option value="3">c</option>
	<option value="4">d</option>
</select>

http://wiki.selfhtml.org/wiki/HTML/Form … _bestimmen

Ich halte es für wahrscheinlich, dass du in dem System, welches du offensichtlich verwendest, auch der Gegenwert bereits hinterlegt ist ... ich rate jetzt mal wink

<option value="<?php echo $_item->getValue() ?>"><?php echo $_item->getLabel() ?></option>
jeff1980 schrieb:

Es gibt sicher viele viele PHP-Foren, aber hier habe ich einfach die beste Erfahrung gemacht

Danke für die Blumen  cool ...


1. Wie bekomme ich hier schnelle Hilfe?
2. HowTo: Fehlersuche bei CMS/ms
---
„First they ignore you, then they laugh at you, then they fight you, then you win.“ Mahatma Ghandi

Offline

#3 13. Juni 2015 07:27

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 604

Re: [GELÖST] PHP - Aufwändiges Suchen und Ersetzen

Der Ansatz ist gut - allerdings wird mit der zur Verfügung stehenden Schnittstelle nur die interne Artikelnummer übertragen. Und an der Schnittstelle kann zumindest im Moment leider nichts angepasst werden - ich muss also mit den Daten leben, die kommen.
Deshalb der Gedanke mit der "Übersetzung", da diese Tabellen eh vorliegen.
Wie es so ist, kam mir in der Nacht noch ein Gedanke, den ich gleich mal testen werde. Ist sicher nicht der sauberste Weg, aber die fehlende Übertragung aller Daten ist schließlich auch nicht sauber ;-).

Ich werde $_item->getLabel() innerhalb der vorhanden foreach-Schleife in einer eigenen Schleife nach und nach gegen die Untereinträge des Arrays prüfen und per if-Abfrage beim passenden Ergebnis die Variable neu belegen.

Soweit zur Theorie :-)

OT: Das mit den Foren meine ich echt ernst. Bevor ich hier schreibe recherchiere ich natürlich, wenn auch nicht immer erfolgreich. Was da manchmal für ein Ton in den Foren herrscht - das möchte ich mir nicht antun. Ich bin dankbar für Lösungsansätze, aber einigen Schreiberlingen möchte ich nicht außerhalb des Internets begegnen ;-)

Beitrag geändert von jeff1980 (13. Juni 2015 07:28)

Offline

#4 13. Juni 2015 09:26

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 604

Re: [GELÖST] PHP - Aufwändiges Suchen und Ersetzen

Es hat geklappt.
Ist ja nicht so, dass ich nicht schon einige Nächte drüber geschlafen hab, aber die Letzte hats gebracht.

[== PHP ==]
<?php /* Artikelnummerngegenüberstellung laden */
	$csv = array();
	$lines = file('daten.csv', FILE_IGNORE_NEW_LINES);
	
	foreach ($lines as $key => $value)
	{
	    $csv[$key] = str_getcsv($value);
	}
?>

<select onchange="setLocation(this.value)">
	<?php foreach ($this->getItems() as $_item): ?>
	
		<?php /* getLabel mit Artikelgegenüberstellung abgleichen und ggf. ersetzen */
			$item_label = $_item->getLabel();
			foreach ($csv as $row) {
				if ($item_label == $row['0']) {
					$item_label = $row['1'];
				} 
			}
		?>
			
	<option><?php echo $item_label ?></option>
	<?php endforeach; ?> 
</select>

Im ersten Teil wird die CSV-Datei geladen und in einem multidimensionalen Array abgelegt.
Im nächsten Schritt wird während des Aufbaus der Optionen-Liste jedes mal die gesamte CSV-Liste abgeglichen. Gibt es einen Treffer, wird die Variable $item_label mit dem gegenübergestelltem Wert gefüllt, ansonsten bleibt sie wie sie ist.

Die aktuelle Liste beinhaltet ca. 200 Zeilen. Aber es funktioniert und die Seite ist nicht merklich langsamer und es ist eh eher als Intranet gedacht.

Offline

#5 13. Juni 2015 12:00

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.156

Re: [GELÖST] PHP - Aufwändiges Suchen und Ersetzen

Nur so als Tipp: Langfristig würde ich da vielleicht eher den Weg über eine Datenbank gehen.
Das sollte nicht nur einfacher sondern auch performanter sein.

Offline

#6 13. Juni 2015 17:58

cyberman
Moderator
Ort: Dohna / Sachsen
Registriert: 13. September 2010
Beiträge: 6.878
Webseite

Re: [GELÖST] PHP - Aufwändiges Suchen und Ersetzen

Ich bleib trotzdem dabei wink

cyberman schrieb:

Ähmm, kann es sein, dass du es dir unnötig schwer machst?

Wenn die Schnittstelle nicht zu gebrauchen ist, kannst du auch ganz drauf pfeifen, und dir das Array für die simple Präsentation im Frontend

<select>
	<option value="1">a</option>
	<option value="2">b</option>
	<option value="3">c</option>
	<option value="4">d</option>
</select>

komplett aus der CSV ziehen ... da braucht es keinen Abgleich zu irgendwas. Wenn es 'ne externe Artikelnummer gibt, muss es eigentlich zwingend auch eine interne geben wink. Das ist so sicher wie das Amen in der Kirche und bedarf keiner separaten Prüfung. Musst halt nur schauen, dass die CSV immer aktuell ist ...

Zusätzliche Abgleiche und Schleifen kosten immer Performance, und das nicht wenig - mach einfach mal einen Lasttest mit 100 Usern wink. Am besten erst gar nicht solche "Unarten" angewöhnen big_smile.

Oder du umgehst die Schnittstelle und greifst direkt auf die Datenbank zu. Datenbanken sind auf das Datenschubsen optimiert, und ein SELECT dürfte da nur wenig Sicherheitsprobleme mit sich bringen ...

OT: Das mit den Foren meine ich echt ernst. Bevor ich hier schreibe recherchiere ich natürlich, wenn auch nicht immer erfolgreich. Was da manchmal für ein Ton in den Foren herrscht - das möchte ich mir nicht antun. Ich bin dankbar für Lösungsansätze, aber einigen Schreiberlingen möchte ich nicht außerhalb des Internets begegnen ;-)

Danke für den Input - nehme das einfach mal als Vorschlag für ein separates Board "PHP / JavaScript", da die Bastelstube bedarfsorientierten Anpassungen von CMSMS vorbehalten bleiben soll.


1. Wie bekomme ich hier schnelle Hilfe?
2. HowTo: Fehlersuche bei CMS/ms
---
„First they ignore you, then they laugh at you, then they fight you, then you win.“ Mahatma Ghandi

Offline

#7 15. Juni 2015 09:11

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 604

Re: [GELÖST] PHP - Aufwändiges Suchen und Ersetzen

@NaN: Den Gedanken finde ich gut - ist erst mal nur Notbehelf, aber wenn es länger so bleibt werd ich das auch machen. Ist dann auch leichter zu pflegen über ein kleines Frontend.

@Cyberman: Wenn es so einfach wäre. Leider hängen an den Daten noch mehr Informationen und es gibt zwar immer eine interne Artikelnummer, aber manchmal (noch) keine Externe ...
Und externer Zugriff auf die Datenbank ist leider nicht möglich - es ist eine MSSQL-Datenbank, die für externe Zugriffe gesperrt ist.
Mir ist bewusst, dass es nicht sauber ist. Und ich werde mit Nachdruck auf eine Aktualisierung der Schnittstelle drängen. Ganz zu schweigen von der doppelten Pflege, die erfahrungsgemäß nicht lange durchgehalten wird. Glücklicherweise wird auf der Seite nicht so viel los sein, dass sie zusammenbrechen wird und über kurz oder lang wird es auch eine andere Lösung geben.
Aber für mich war es auch wieder eine Lernerfahrung smile

Die Idee mit dem PHP/Javascript-Bereich finde ich super. Manchmal ist der Übergang von CMSms (Smarty & Co.) zu den grundlegenden Sprachen ja fließend.
Und danke, dass ich diese Frage hier einfach stellen konnte, obwohl sie nichts mit CMSms zu tun hat.

Offline

#8 15. Juni 2015 09:45

cyberman
Moderator
Ort: Dohna / Sachsen
Registriert: 13. September 2010
Beiträge: 6.878
Webseite

Re: [GELÖST] PHP - Aufwändiges Suchen und Ersetzen

jeff1980 schrieb:

Leider hängen an den Daten noch mehr Informationen und es gibt zwar immer eine interne Artikelnummer, aber manchmal (noch) keine Externe ...
Und externer Zugriff auf die Datenbank ist leider nicht möglich - es ist eine MSSQL-Datenbank, die für externe Zugriffe gesperrt ist.

Ist ja echt doof ... trotzdem nervt dieses Rumgefrickel wink.

Hmm, du könntest doch die Daten komplett in 'ne CSV ziehen, wo du keine Zugriffsbeschränkungen mehr hast.

Oder du baust dir bereits VOR der Ausgabe als HTML aus getLabel() und CSV ein Array, mit dem dies

http://www.cmsmadesimple.de/forum/viewt … 398#p35398

möglich wird (quasi deine eigene Schnittstelle wink).

Wie gesagt - ein replace, egal in welcher Form, ist für eine performante Programmierung alles andere als optimal ... sozusagen die "teuerste" aller möglichen Varianten.

Beitrag geändert von cyberman (15. Juni 2015 09:47)


1. Wie bekomme ich hier schnelle Hilfe?
2. HowTo: Fehlersuche bei CMS/ms
---
„First they ignore you, then they laugh at you, then they fight you, then you win.“ Mahatma Ghandi

Offline