• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

strpos für array value und key?

nikl

Neues Mitglied
Hallo!
Ich habe folgendes Vorhaben: ich versuche auf einer Seite eine alphabetische Liste von verlinkten Herstellerlogos auszugeben. Da diese Liste regelmäßig überarbeitet wird (weil neue Einträge dazukommen oder alte hinausfliegen), würde ich gerne etwas mehr oder weniger dynamisches haben, wo ich Hersteller-URL und den Herstellernamen nur in einem array einfügen muss und die Sortierung dann automatisch folgt.
Grundsätzlich hätte ich das so umgesetzt (in diesem Beispiel werden die URLs in einem p tag ausgegeben, Logos werden nicht dargestellt, es geht hier lediglich um die Grundfunktion):

Code:
        <?php
            $urls = array("http://blabla/Def.html", "http://blabla/Ghi.html", "http://blabla/Mno.html", "http://blabla/Jkl.html", "http://blabla/Abc.html");
            $namen = array("Mno", "Abc", "Jkl", "Def", "Ghi");
            asort($namen);
        ?>
        <?php foreach ($namen as $key => $val): ?>
            <?php foreach ($urls as $url): ?>
                <?php $pos = strpos($url, $val); ?>
                <?php if ($pos == true ): ?>
                    <?php echo "<p>$url</p>"; ?>
                <?php endif; ?>
            <?php endforeach; ?>
        <?php endforeach; ?>

Das Ergebnis sieht dann so aus:

Code:
    http://blabla/Abc.html
    http://blabla/Def.html
    http://blabla/Ghi.html
    http://blabla/Jkl.html
    http://blabla/Mno.html

Das ganze könnte ich dann entpsrechend anpassen um die verlinkten Bilder auszugeben und fertig... Das Problem an der Sache ist, dass manche der Hersteller-URLs nicht den Herstellernamen in der URL haben, sondern eine ID die diesem Hersteller entspricht. <?php $pos = strpos($url, $val); ?> hilft mir hier also nicht.
Ich brauche daher eine Möglichkeit, zu überprüfen, ob die Variable $url den Herstellernamen oder die Hersteller-Id beinhaltet.

Der obere Teil sieht dann also wiefolgt aus:

Code:
        <?php
            $urls = array("http://blabla/Def.html", "http://blabla/119.html", "http://blabla/Mno.html", "http://blabla/236.html", "http://blabla/Abc.html");
            $namen = array(001 => "Mno", 002 => "Abc", 236 => "Jkl", 003 => "Def", 119 => "Ghi");
            asort($namen);
        ?>

Statt ../Ghi.html heißt die URL jetzt ../119.html bzw statt ../Jkl.html jetzt ../236.html.

Ich hatte eigentlich gehofft, den Code so anpassen zu können um das zu erreichen, was ich vorhabe:

Code:
        <?php $pos = strpos($url, $val); ?>
        <?php $idpos = strpos($url, $key); ?>
        <?php if ($idpos == true || $pos == true ): ?>
            <?php echo "<p>$url</p>"; ?>
        <?php endif; ?>

Leider werden die URLs mit den Ids so aber auch nicht dargestellt. Bzw mach ich aus <?php if ($idpos == true || $pos == true ): ?> ein <?php if ($idpos = true || $pos = true ): ?> (jeweils nur ein = ) wird mir folgendes ausgegeben:

Code:
http://blabla/Def.html
http://blabla/119.html
http://blabla/Mno.html
http://blabla/236.html
http://blabla/Abc.html
http://blabla/Def.html
http://blabla/119.html
http://blabla/Mno.html
http://blabla/236.html
http://blabla/Abc.html
http://blabla/Def.html
http://blabla/119.html
http://blabla/Mno.html
http://blabla/236.html
http://blabla/Abc.html
http://blabla/Def.html
http://blabla/119.html
http://blabla/Mno.html
http://blabla/236.html
http://blabla/Abc.html
http://blabla/Def.html
http://blabla/119.html
http://blabla/Mno.html
http://blabla/236.html
http://blabla/Abc.html

Was mache ich falsch? Oder ist die Umsetzung von Anfang an Blödsinn und mein Vorhaben so gar nicht möglich? Danke im Voraus!
 
Zuletzt bearbeitet:
@mermshaus: Das hat er sich wahrscheinlich einfach so als Beispiel ausgedacht, so dass Firma "Html GmbH" z.B. "1337" als ID hätte und trotzdem da der Anfangsbuchstabe der Firma, also "H" , relativ in der Mitte der Ausgegebenen Daten liegt.

Http://.../Anton AG.html
Http://.../Gustavo_Fring.html
Http://.../1337.html ( Die URL ist nur als ID "1337" vorhanden, daher wird statt "Html Gmbh", 1337 ausgegeben )

.. so hab ich das verstanden...


@nikl :

Das Problem an der Sache ist, dass manche der Hersteller-URLs nicht den Herstellernamen in der URL haben, sondern eine ID die diesem Hersteller entspricht.

Was genau heißt das? Bei einer Hersteller URL würde ich erwarten, dass bei "Html GmbH" als URL "http://www.html.de" ausgegeben wird. Was für eine ID soll da ansonsten ausgegeben werden? Allgemein bei URL sollte doch von der Logik her keine ID stehen. In einem Adressfeld stehen ja auch nicht die Geburtstage drine oder?

Ansonsten kannst du das auch Objektorientier lösen, wenn ich dein Problem richtig verstanden habe.

Dabei teilst du einem "Firmen"-Objekt die ganzen Eigenschaften zu und je nachdem, ob ID oder URL vorhanden ist, kannst du agieren.

PHP:
<?php
   class Firma {
      public $id;
      public $name;
      public $url;
      

      public function __construct( $name, $url){
          $this->name = $name;
          if( is_numeric( $url ) ){
            $this->id = $url;
            $this->generateUrlById();
          } else {
            $this->url = $url;
            $this->generateUrlByUrl();
          }
      }

      public function generateUrlById(){
         return '<a href="http://.../'.$this->id.'.html" title="'.$this->name.'" >'.$this->name.'</a>';
      }

      public function generateUrlByUrl(){
         return '<a href="'.$this->url.'" title="'.$this->name.'" >'.$this->name.'</a>';
      }
  
   }






  $Firma1 = new Firma( 'Html GmbH', 'http://www.html.de' );
  echo $Firma1;
?>

So in der Art.. ich verstehe immer noch nicht ganz wie das Allgemein bei dir läuft..
 
@zorndyuke:

Warum dann aber das hier? (Aus Beitrag #1.)

Code:
$namen = array(001 => "Mno", 002 => "Abc", 119 => "Jkl", 003 => "Def", 236 => "Ghi");

Das sind genau entgegengesetzte Zuordnungen von Zahlen und Zeichenketten. Ghi ist da 236, nicht 119. Umgekehrt für Jkl.

Natürlich können wir spekulieren, dass an einer Stelle ein Dreher ist. Aber, na ja, zumindest ich habe mir vorgenommen, in höherem Maße auf verständliche Fragestellungen zu achten und deshalb so was lieber nachzufragen.
 
Hmm.. entweder hat er das mit den Array's noch nicht so ganz verstanden, oder.. oder.. du hast Recht, lasset uns auf eine Konkrete Antwort warten.
 
Meinst du sowas ??
PHP:
$urls = array("http://blabla/Def.html", "http://blabla/Ghi.html", "http://blabla/Mno.html", "http://blabla/Jkl.html", "http://blabla/Abc.html");
$namen = array("001" => "Mno", "002" => "Abc", "119" => "Jkl", "003" => "Def", "236" => "Ghi");
asort($namen);

foreach ($namen as $key => $val)
{
    foreach ($urls as $url)
    {
        $pos = strpos($url, $val);
        if ($pos == true)
        {
            $url = str_replace($val,$key,$url);
            echo "<p>$url</p>";
        }
    }
}
 
Hey, danke für die Hilfe!

Ok, ich gehe das mal nacheinander durch:

Wie kommst du auf 119 für Ghi? Die Logik sehe ich nicht.
Eine Logik kann man hier nicht erkennen. Die Hersteller wurden in einer DB angelegt - die Ids wurden automatisch vergeben. Wie zorndyuke schreibt, ist das hier also nur ein willkürliches Beispiel.

Was genau heißt das? Bei einer Hersteller URL würde ich erwarten, dass bei "Html GmbH" als URL "http://www.html.de" ausgegeben wird. Was für eine ID soll da ansonsten ausgegeben werden? Allgemein bei URL sollte doch von der Logik her keine ID stehen. In einem Adressfeld stehen ja auch nicht die Geburtstage drine oder?
Ich hol mal etwas aus, um die Sache evtl nachvollziehbarer zu machen. Das ganze soll in einem Onl9ineshop Verwendung finden. Auf einer Seite auf der alle Herstellerlogos gelistet werden. Bekannte Hersteller mit einer großen Produktpalette, haben eine eigene Kategorie, sind also auch über eine eigene URL wie z.B. beispielshop.de/herstellerA.html erreichbar. Bei weniger bekannten Herstellern, wollten wir auf eine eigens hierfür angelegte Kategorie verzichten - die Produkte werden daher über die erweiterte Suchfunktion des Shops gelistet. Die URL sieht in diesem Falle dann in etwa so aus: beispielshop.de/catalogsearch/result/?hersteller_search[]=119. Das heißt die URL enthält die Id des Herstellers, nicht aber die Herstellerbezeichnung.

Das sind genau entgegengesetzte Zuordnungen von Zahlen und Zeichenketten. Ghi ist da 236, nicht 119. Umgekehrt für Jkl.
War ein Dreher, habe es ausgebessert.

Hmm.. entweder hat er das mit den Array's noch nicht so ganz verstanden [...]
Ich befürchte das selbst auch... :/

Meinst du sowas ??
Hier würden die URLs dann aber in dieser Form ausgegeben:
Code:
http://blabla/002.html
http://blabla/003.html
http://blabla/119.html
http://blabla/236.html
http://blabla/001.html

Du überprüfst die Variable $url hier ja trotzdem nur auf $val, statt auf $val und $key. Das Ersetzen von $val mit $key in der URL, hilft mir leider nicht weiter, da ja beide Varianten vorkommen. Ich suche also eine Möglichkeit um es so darzustellen:
Code:
http://blabla/Abc.html
http://blabla/Def.html
http://blabla/119.html
http://blabla/236.html
http://blabla/Mno.html
 
Zuletzt bearbeitet:
......
Du überprüfst die Variable $url hier ja trotzdem nur auf $val, statt auf $val und $key. Das Ersetzen von $val mit $key in der URL, hilft mir leider nicht weiter, da ja beide Varianten vorkommen. Ich suche also eine Möglichkeit um es so darzustellen:
Code:
http://blabla/Abc.html
http://blabla/Def.html
http://blabla/119.html
http://blabla/236.html
http://blabla/Mno.html
Genau da ist mein Problem, ich sehe keine Regelmässigkeit, wann durch die ID ersetzt werden soll und wann nicht. Ohne eine Regel, die man prüfen kann, stehe ich neben mir.
Kann man sagen, dass alle ID`s kleiner 100 mit dem Namen ersetzt werden sollen oder nach welchen Kriterien wird da ausgewählt?

Serhe ich mir deine Arrays an und das, was am Ende rauskommen soll, scheint mir die Auswahl willkürlich.
 
Besteht eine 1:1 Zuordnung von einem URL zu einem Herstellernamen? Dann könntest du die Daten einfach so ablegen:

PHP:
$links = array(
    'Company C' => 'http://example.org/c.html',
    'Company A' => 'http://example.org/112.html',
    'Company D' => 'http://example.org/235.html',
    'Company B' => 'http://example.org/b.html'
);

ksort($links);

var_dump($links);
 
Es gibt keine Regelmässigkeit.
Gibt es keine Möglichkeit einem Hersteller 2 Variablen zuzuordnen - einmal den Namen und einmal die Id um somit eine Liste von URLs auf beide Werte abzugleichen - es ist ja immer nur einer von beiden vorhanden.
D.h. wenn ich einem Hersteller einen Wert "Xyz" als Namen und einen Wert "1000" als Id zuweise und eine Liste von URLs abfrage, ob eine URL vorkommt, die entweder "Xyz" oder "1000" enthält und dann eben die URL ausgebe - das muss doch machbar sein ohne eine Beschränkung, wann die Id gesucht werden soll und wann der Name?
 
Ohne Regelmässigkeit siehst du aber schon selber das Problem oder.
Was du da versuchst ist ein Kreuzprodukt aus allen Einträgen in den Arrays. Ohne Prüfung, ob es die Seite gibt, verursachst du mal eine 404 Meldung und mal nicht. Das kann ja nicht in deinem Sinn sein.
Woher soll dein Script denn wissen, wann es $key und wann $val nehmen soll.

Da würde ich dringendst mermshaus Variante anraten und keine wilden Konstrukte fabrizieren.

Ansonsten könntest du ein array erzeugen, dass so aussieht:
PHP:
$namen = array("Mno" => "Mno", "Abc" => "Abc", "119" => "Jkl", "Def" => "Def", "236" => "Ghi")
Dann klappt mein Code wieder.
 
Sorry, ich bin in der letzten Zeit etwas lustlos, was das Nachdenken über und Verstehen von Fragen angeht. Ich fasse noch mal zusammen, was ich jetzt verstanden habe.

Du hast eine Liste von „Repräsentationen“, die für je eine Firma stehen können.

Code:
Firma 1: (Mno)
Firma 2: (Abc)
Firma 3: (119, Jkl)
Firma 4: (Def)
Firma 5: (236, Ghi)

Außerdem hast du eine List von URLs, in denen diese Repräsentationen auftreten.

Jetzt willst du diese URLs nach den Namen der Firmen sortieren.

PHP:
<?php

$urls = array(
    'http://example.org/Mno.html',
    'http://example.org/119.html',
    'http://example.org/Abc.html',
    'http://example.org/Mno.html',
    'http://example.org/Def.html',
    'http://example.org/Pqr.html',
    'http://example.org/Ghi.html',
    'http://example.org/236.html',
    'http://example.org/Jkl.html',
    'http://example.org/236.html',
    'http://example.org/Def.html',
    'http://example.org/Abc.html'
);

$companies = array(
    'Company C' => array('Def'),
    'Company F' => array('Mno'),
    'Company A' => array('Ghi', '236'),
    'Company D' => array('Abc'),
    'Company B' => array('Jkl', '119'),
    'Company E' => array('Pqr')
);

//

$companyToUrlsMap = array();

//

foreach ($urls as $url) {
    foreach ($companies as $companyName => $representations) {
        foreach ($representations as $representation) {
            if (strpos($url, $representation) !== false) {
                if (!isset($companyToUrlsMap[$companyName])) {
                    $companyToUrlsMap[$companyName] = array();
                }
                $companyToUrlsMap[$companyName][] = $url;
                break 2;
            }
        }
    }
}

ksort($companyToUrlsMap);

var_dump($companyToUrlsMap);

Code:
array(6) {
  ["Company A"]=>
  array(3) {
    [0]=>
    string(27) "http://example.org/Ghi.html"
    [1]=>
    string(27) "http://example.org/236.html"
    [2]=>
    string(27) "http://example.org/236.html"
  }
  ["Company B"]=>
  array(2) {
    [0]=>
    string(27) "http://example.org/119.html"
    [1]=>
    string(27) "http://example.org/Jkl.html"
  }
  ["Company C"]=>
  array(2) {
    [0]=>
    string(27) "http://example.org/Def.html"
    [1]=>
    string(27) "http://example.org/Def.html"
  }
  ["Company D"]=>
  array(2) {
    [0]=>
    string(27) "http://example.org/Abc.html"
    [1]=>
    string(27) "http://example.org/Abc.html"
  }
  ["Company E"]=>
  array(1) {
    [0]=>
    string(27) "http://example.org/Pqr.html"
  }
  ["Company F"]=>
  array(2) {
    [0]=>
    string(27) "http://example.org/Mno.html"
    [1]=>
    string(27) "http://example.org/Mno.html"
  }
}
 
PHP:
<?php

$urls = array(
    'http://example.org/Mno.html',
    'http://example.org/119.html',
    'http://example.org/Abc.html',
    'http://example.org/Mno.html',
    'http://example.org/Def.html',
    'http://example.org/Pqr.html',
    'http://example.org/Ghi.html',
    'http://example.org/236.html',
    'http://example.org/Jkl.html',
    'http://example.org/236.html',
    'http://example.org/Def.html',
    'http://example.org/Abc.html'
);

$companies = array(
    'Company C' => array('Def'),
    'Company F' => array('Mno'),
    'Company A' => array('Ghi', '236'),
    'Company D' => array('Abc'),
    'Company B' => array('Jkl', '119'),
    'Company E' => array('Pqr')
);

//

$companyToUrlsMap = array();

//

foreach ($urls as $url) {
    foreach ($companies as $companyName => $representations) {
        foreach ($representations as $representation) {
            if (strpos($url, $representation) !== false) {
                if (!isset($companyToUrlsMap[$companyName])) {
                    $companyToUrlsMap[$companyName] = array();
                }
                $companyToUrlsMap[$companyName][] = $url;
                break 2;
            }
        }
    }
}

ksort($companyToUrlsMap);

var_dump($companyToUrlsMap);

Ich rate von der 1:1-Implementierung hiervon ab, denn PHP5.4 wird "break/continue $var syntax." abgeschaffen.
 
Offtopic:

Kein Problem. Ich würde von mir jetzt auch nicht behaupten, immer jede kommende PHP-Entwicklung zu kennen. So gesehen finde ich solche Hinweise gut, auch wenn sie manchmal nicht ins Schwarze treffen. Danke auch für die Klarstellung, aichingm.

Die Scheußlichkeit mit den Variablen kannte ich auch nicht.
 
Offtopic:
ich musste auch erst nachlesen weil es mich doch sehr bestürzt hätte break 2; zu entfernen (da wäre ein bisschen arbeit auf mich zugekommen), von break $var; hatte ich auch noch nie gehört.
 
Offtopic:
ich musste auch erst nachlesen weil es mich doch sehr bestürzt hätte break 2; zu entfernen (da wäre ein bisschen arbeit auf mich zugekommen), von break $var; hatte ich auch noch nie gehört.
Wer würde auf sowas auch kommen, geschweige denn einsetzen. Wahrscheinlich wird es mangels Einsatz entfernt :mrgreen:
 
Zurück
Oben