Ankündigung

Einklappen
Keine Ankündigung bisher.

Mehrdimensionales Array nach bestimmten Wert durchsuchen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #31
    Zitat von kaminbausatz Beitrag anzeigen
    #24
    was ein Gemetzel, ich habe es jetzt nicht probiert, kann mir aber vorstellen, dass eine Suche mit
    PHP-Code:
    print_r(test::product_search('X Y'$dataArr)); 
    einen Fehler auswirft.

    es sei denn Du hast $result_array bereits irgendwo definiert. Das ist anhand des Codeausschnitts nicht sichtbar. Wenn nichts gefunden wird müsste undefined variable: result_array als Fehlermeldung kommen.
    Hallo, ja klar:

    PHP-Code:
    //Klassen einbinden
    spl_autoload_register(function($class_name) { // PHP 7.2
        
    include $class_name.'.inc.php';
    });

    error_reporting(-1);
    ini_set('display_errors'TRUE);

    /**
     * PRODUCTS
     *
     * @package
     * @author
     * @copyright
     * @version 2018
     * @access public
     */
    class PRODUCTS extends DATA{
      private 
    $norm_data_array;
      private 
    $search_string;
      private 
    $result_array;
      private 
    $data_array;

       
    /**
       * PRODUCTS::__construct()
       * Konstruktor, hier werden die Default-Werte für die Klassenvariablen gesetzt.
       * @param stromg $file
       * @param string $delimiter
       */
      //Constructor...
        
    public function __construct(){ // to do: default Wert übergeben aus Elternklasse
        
    parent::__construct();
        
    $this->norm_data_array=array();
        
    $this->search_string="";
        
    $this->result_array=array();
        
    $this->data_array=array();
        return 
    true;
        } 
    Aber interessante Testmethode...werd ich mal probieren.

    Kommentar


    • #32
      Zitat von Zeichen32 Beitrag anzeigen
      PHP-Code:
      if (empty($search_string) || empty($data_array)) {
      return 
      $this->result_array;

      Ich würde hier noch ein leeres Array zurückgeben, damit die Funktion nicht verschiedene Rückgabetypen hat.
      So, oder halt nur ein return pro Funktion....besser.

      Kommentar


      • #33
        Zitat von ChookaP Beitrag anzeigen

        So, oder halt nur ein return pro Funktion....besser.

        Negativ. Dein Schachtelwirrwarr ist schrecklich zu lesen. So lange die returns nicht irgendwo im Code versteckt sind ist es vollkommen ok mehrere zu nutzen.
        [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
        [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

        Kommentar


        • #34
          Zitat von kaminbausatz Beitrag anzeigen
          eine kleine Alternative, search key kann simpel ergänzt werden...
          PHP-Code:
          <?php
          $carsCSV 
          = <<<EOF
          marke,typ,baujahr,preis
          Mercedes, "C 220 D",2009,12000
          Mercedes, "E 220 D",2010,14000
          EOF;
          $cars array_map('str_getcsv'array_map('trim'explode(PHP_EOL$carsCSV)));
          array_walk($cars, function(&$row,$z$headers) {$row array_combine($headers$row);}, array_shift($cars));

          function 
          product_search($search_string$myArray){
          $iterator = new RecursiveArrayIterator($myArray);
          while (
          $iterator->valid()) {
          if (
          $iterator->hasChildren()) {
          foreach (
          $iterator->getChildren() as $key => $value) {
          if (
          stristr(preg_replace('/\s+/'''$value), preg_replace('/\s+/''',$search_string))){
          $tt[]=(array)$iterator->getChildren();
          break;
          }
          }
          }
          $iterator->next();
          }
          return 
          $tt ?? null;
          }
          var_dump(product_search('e220 d'$cars));
          ?>
          Interessanter Ansatz, aber wo ist RecursiveArrayIterator() definiert? Ich mein ich kann es mir auch Abstrakt denken. Aber die Klasse müsste ich schon ierwie vorliegen haben?

          Kommentar


          • #35
            Das gehört zur Standard PHP Library. Guckst du im Handbuch
            sorry, shift-taste kaputt

            Kommentar


            • #36
              Wenn man mehrere Filter braucht und
              Zitat von ChookaP Beitrag anzeigen
              Werte kleiner, größer, kleiner als, größer als suchen etc.
              Beispiel Aufruf:
              PHP-Code:
              $filters = [
                  [
              'price''>'50],
                  [
              'title''=''TOYO'],
                  [
              'description''LIKE''MARSHAL'],
              ];

              var_dump(filterByArray($filters$foo)); 
              PHP-Code:
              function filterByArray($filters_arr$rows) {
                
              $buildFilter = function($op$val) {
                  return function(
              $data) use ($val$op) {
                      switch(
              $op) {
                          case 
              '=':
                          case 
              '==':
                              return (
              $data == $val);
                          case 
              '===':
                              return (
              $data === $val);
                          case 
              '!=':
                              return (
              $data != $val);
                          case 
              '!==':
                              return (
              $data !== $val);
                          case 
              '>':
                              return (
              $data $val);
                          case 
              '>=':
                              return (
              $data >= $val);
                          case 
              '<':
                              return (
              $data $val);
                          case 
              '<=':
                              return (
              $data <= $val);
                          case 
              'LIKE':
                              return ( 
              stristr($data$val) !== false );
                          default:
                              throw new \
              Exception('Unknown operand ' $op);
                      }
                  };
                };

                
              $filters = array();
                foreach(
              $filters_arr as $k => $v) {
                  list(
              $key$op$val) = $v;

                  if( !isset(
              $filters[$key]) ) {
                      
              $filters[$key] = $buildFilter($op$val);
                  } else {
                      if( !
              is_array($filters[$key]) ) {
                          
              $filters[$key] = array($filters[$key]);
                      }
                      
              $filters[$key][] = $buildFilter($op$val);
                  }
                }

                
              $applyFilter = function($row$fk$fv) {
                  if( !
              array_key_exists($fk$row) ) {
                    return 
              false;
                  }

                  
              $val $row[$fk];

                  if( 
              is_array($fv) ) {
                      foreach(
              $fv as $ft) {
                          if( 
              $ft($val) === true ) return true;
                      }
                  } else {
                      if( 
              $fv($val) === true ) return true;
                  }

                  return 
              false;
                };

                
              $result = array();
                foreach(
              $rows as $row) {
                  
              $r = array();
                  foreach(
              $filters as $fk => $fv) {
                      
              $r[] = $applyFilter($row$fk$fv);
                  }

                  
              $r array_filter($r);

                  if( 
              count($r) == count($filters) ) {
                      
              $result[] = $row;
                  }
                }

                return 
              $result;

              sorry, shift-taste kaputt

              Kommentar


              • #37
                Zitat von Meister1900 Beitrag anzeigen
                Wenn man mehrere Filter braucht und
                so etwas ist mir mal begegnet...
                http://sandbox.onlinephpfunctions.co...51d4cce0db6a68

                @ChookaP

                Diese if or Gedöns ist schrecklich und mit einer Zeile Code zu erschlagen:

                PHP-Code:
                $myData "Mercedes C 220 D silbergrau";
                $mySearch "C220D";

                var_dump stristr(preg_replace('/\s+/'''$myData), preg_replace('/\s+/''',$mySearch)) ? $myData null);

                $mySearch "X220D";
                var_dump stristr(preg_replace('/\s+/'''$myData), preg_replace('/\s+/''',$mySearch)) ? $myData null); 

                Kommentar


                • #38
                  Zitat von kaminbausatz Beitrag anzeigen
                  so etwas ist mir mal begegnet...
                  http://sandbox.onlinephpfunctions.co...51d4cce0db6a68

                  @ChookaP

                  Diese if or Gedöns ist schrecklich und mit einer Zeile Code zu erschlagen:

                  PHP-Code:
                  $myData "Mercedes C 220 D silbergrau";
                  $mySearch "C220D";

                  var_dump stristr(preg_replace('/\s+/'''$myData), preg_replace('/\s+/''',$mySearch)) ? $myData null);

                  $mySearch "X220D";
                  var_dump stristr(preg_replace('/\s+/'''$myData), preg_replace('/\s+/''',$mySearch)) ? $myData null); 
                  Ok. So etwa:

                  PHP-Code:
                  /**
                    * PRODUCTS::product_search()
                    * Führt eine Suche über $norm_data_array aus.
                    * @param string $search_string
                    * @param array $data_array
                    * @return array $result_array
                    */
                    
                  public function product_search($search_string,$data_array){
                      if(!empty(
                  $search_string) && !empty($data_array)){
                        foreach(
                  $data_array as $key=>$row){
                          
                  in_array($search_string,$row) || in_array($search_string,array_map('strtolower',$row)) || in_array(str_replace(" ","",$search_string),str_replace(" ","",$row)) ? $this->result_array[]=$row null;
                          foreach(
                  $row as $key=>$value){
                            
                  stristr(preg_replace('/\s+/'''$value), preg_replace('/\s+/''',$search_string)) ? $this->result_array[]=$row null;
                          }
                        }  
                        return 
                  $this->result_array;
                      }
                      
                  //print_r(test::product_search('205/65', $data_array));  
                    

                  Kommentar


                  • #39
                    Zitat von Meister1900 Beitrag anzeigen
                    Das gehört zur Standard PHP Library. Guckst du im Handbuch
                    Copy.

                    Kommentar


                    • #40
                      Zitat von VPh Beitrag anzeigen


                      Negativ. Dein Schachtelwirrwarr ist schrecklich zu lesen. So lange die returns nicht irgendwo im Code versteckt sind ist es vollkommen ok mehrere zu nutzen.
                      Hm...kay, wenn es semantisch nachvollziehbar ist und die returns vom selben Typ sind, warum nicht.

                      Und ich bin gerne bereit an meinem Codestil zu arbeiten, natürlich, danke.

                      Kommentar

                      Lädt...
                      X