Θέλω να εξαιρέσω κάποιες συμβολοσειρές από έναν php array

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
philos
Δημοσιεύσεις: 264
Εγγραφή: 30 Αύγ 2007 23:32

Θέλω να εξαιρέσω κάποιες συμβολοσειρές από έναν php array

Δημοσίευση από philos » 11 Μαρ 2014 00:21

Λοιπόν, έχουμε τον πίνακα $test ο οποίος περιλαμβάνει στο κλειδί name κάποια ονόματα.
Κάνω προσπέλαση όλων των ονομάτων σε μια foreach.
Με χρήση της ακόλουθης συνάρτησης που βρήκα στο διαδίκτυο, τσεκάρω μέσα στη foreach κάθε όνομα και αν ταιριάζει, το κρατάω, αλλιώς κάνω continue.

Κώδικας: Επιλογή όλων

          if (!like_match('%' . $query . '%',$test['name']))
          {
            continue;
          }

Κώδικας: Επιλογή όλων

function like_match($pattern, $subject)
{
    $pattern = str_replace('%', '.*', preg_quote($pattern));
    return (bool) preg_match("/^{$pattern}$/i", $subject);
}
Η like_match κάνει το αντίστοιχο που κάνει η LIKE στη MySQL.

Το συγκεκριμένο script είναι ένα autocomplete φόρμας.
Όταν γράφω στο πεδίο αναζήτησης "st", μου επιστρέφει μεταξύ άλλων και το αποτέλεσμα:
Test lalala

Πως μπορώ να εξαιρέσω αυτό το αποτέλεσμα;
Προφανώς θέλω το $query να ταιριάζει μόνο με τις αρχές των λέξεων.
Πχ δεκτών αποτελεσμάτων, αν ψάχνουμε για "Rai":
Tomb Raider
Railala Loloa

αλλά όχι δεκτό το:
Samurai test

Ευχαριστώ!

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6235
Εγγραφή: 30 Νοέμ 2004 03:09

Θέλω να εξαιρέσω κάποιες συμβολοσειρές από έναν php array

Δημοσίευση από fafos » 11 Μαρ 2014 03:00

dokimase kati proxeiro:

Κώδικας: Επιλογή όλων

function like_match($pattern, $subject)
{
	$new_subject = explode(' ', $subject);
	$match = 0;
	$pattern = str_replace('%', '.*', preg_quote($pattern));
		foreach($new_subject as $s){
			if((bool) preg_match("/^{$pattern}$/i", $s) === FALSE){	
				$match = $match;
			} else {
				$match = $match +1;
			}
		}
	return $match;	
}
kai

Κώδικας: Επιλογή όλων

          if (like_match($query . '%',$test['name']) == 0)
          {
            continue;
          }
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Θέλω να εξαιρέσω κάποιες συμβολοσειρές από έναν php array

Δημοσίευση από gvre » 11 Μαρ 2014 13:49

philos έγραψε:Λοιπόν, έχουμε τον πίνακα $test ο οποίος περιλαμβάνει στο κλειδί name κάποια ονόματα.
Κάνω προσπέλαση όλων των ονομάτων σε μια foreach.
Με χρήση της ακόλουθης συνάρτησης που βρήκα στο διαδίκτυο, τσεκάρω μέσα στη foreach κάθε όνομα και αν ταιριάζει, το κρατάω, αλλιώς κάνω continue.
Πόσα στοιχεία έχει περίπου το array και με ποιον τρόπο δημιουργείται; Από τα στοιχεία που θα ταιριάζουν, θέλεις μόνο τα keys ή και τα values;

Άβαταρ μέλους
philos
Δημοσιεύσεις: 264
Εγγραφή: 30 Αύγ 2007 23:32

Θέλω να εξαιρέσω κάποιες συμβολοσειρές από έναν php array

Δημοσίευση από philos » 11 Μαρ 2014 13:54

gvre έγραψε:
philos έγραψε:Λοιπόν, έχουμε τον πίνακα $test ο οποίος περιλαμβάνει στο κλειδί name κάποια ονόματα.
Κάνω προσπέλαση όλων των ονομάτων σε μια foreach.
Με χρήση της ακόλουθης συνάρτησης που βρήκα στο διαδίκτυο, τσεκάρω μέσα στη foreach κάθε όνομα και αν ταιριάζει, το κρατάω, αλλιώς κάνω continue.
Πόσα στοιχεία έχει περίπου το array και με ποιον τρόπο δημιουργείται; Από τα στοιχεία που θα ταιριάζουν, θέλεις μόνο τα keys ή και τα values;
Γύρω στα 300. Θα ήθελα και τα values.

Τι εννοείς με ποιον τρόπο δημιουργείται; Είναι ένας πίνακας ο οποίος έχει κι άλλα keys με values. Το 'name' είναι ένα από αυτά.
Απλά δεν ξέρω πως να εξαιρέσω τα στοιχεία των $test['name'] που έχουν λέξεις που τελειώνουν με χαρακτήρες που ταιριάζουν με το $query.

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Θέλω να εξαιρέσω κάποιες συμβολοσειρές από έναν php array

Δημοσίευση από gvre » 11 Μαρ 2014 16:06

Αν το array σου είναι κάπως έτσι

Κώδικας: Επιλογή όλων

$array = array
(
    array('name' => 'Tomb Raider', 'value' => 'any 1'),
    array('name' => 'Railala Loloa', 'value' => 'any 2'),
    array('name' => 'Samurai test', 'value' => 'any 3'),
);
μπορείς να το περάσεις ως έχει στην παρακάτω συνάρτηση και να πάρεις το αποτέλεσμα. Αν και δεν έχει σχέση με το πρόβλημά σου, μπορείς αντί να κάνεις 200 function calls, να κάνεις 1 και να του περάσεις ολόκληρο το array.
Αυτό που χρειάζεται για να γίνει το match όπως θέλεις είναι ένα \b στην αρχή του pattern.

Κώδικας: Επιλογή όλων

function match($pattern, $subject)
{
    $res = array();
    $pattern = '/\b' . preg_quote($pattern) . '/i';
    foreach($subject as $s)
    {
        if (preg_match($pattern, $s['name']))
            $res[] = $s;
    }
    return $res;
}

print_r(match('Rai', $array));

Άβαταρ μέλους
philos
Δημοσιεύσεις: 264
Εγγραφή: 30 Αύγ 2007 23:32

Θέλω να εξαιρέσω κάποιες συμβολοσειρές από έναν php array

Δημοσίευση από philos » 11 Μαρ 2014 17:11

Ευχαριστώ πολύ, λειτουργεί όπως θέλω! :D

Άλλη μια ερώτηση:
Αν ψάχνουμε για "Rai" και επιστρέφονται τα:
Tomb Raider
Samurai test
Railala Loloa

Πως μπορώ να κάνω sort τον πίνακα βάσει του $test['name'] ώστε να πάρουν την ακόλουθη σειρά τα αποτελέσματα:
Railala Loloa
Tomb Raider
Samurai test

?

Δηλαδή πρώτα να μπουν τα αποτελέσματα που η πρώτη λέξη ξεκινάει με το ερώτημα, μετά που οι άλλες λέξεις ξεκινάνε με το ερώτημα και τέλος τα αποτελέσματα που έχουν ανάμεσα στις λέξεις ταίριασμα με το ερώτημα;

Δυστυχώς είναι πολύ πολύπλοκο για μένα κάτι τέτοιο.

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Θέλω να εξαιρέσω κάποιες συμβολοσειρές από έναν php array

Δημοσίευση από gvre » 11 Μαρ 2014 17:45

Το παρακάτω κάνει αυτό που θέλεις (κάνε μερικές δοκιμές για να βεβαιωθείς).

Κώδικας: Επιλογή όλων

function match($pattern, $subject)
{
    $res = array();
    $resPos = array();
    $origPattern = $pattern;
    $pattern = '/\b' . preg_quote($pattern) . '/i';
    foreach($subject as $s)
    {
        if (preg_match($pattern, $s['name']))
            $res[] = $s;
        else if (stripos($s['name'], $origPattern) !== false)
            $resPos[] = $s;
    }

    usort($res, function($a, $b) use($origPattern) {
        return stripos($a['name'], $origPattern) > stripos($b['name'], $origPattern);
    });

    usort($resPos, function($a, $b) use($origPattern) {
        return stripos($a['name'], $origPattern) > stripos($b['name'], $origPattern);
    });

    return array_merge($res, $resPos);
}

print_r(match('Rai', $array));

Άβαταρ μέλους
philos
Δημοσιεύσεις: 264
Εγγραφή: 30 Αύγ 2007 23:32

Θέλω να εξαιρέσω κάποιες συμβολοσειρές από έναν php array

Δημοσίευση από philos » 11 Μαρ 2014 17:57

Δουλεύει κανονικότατα το autocomplete πλέον! :D

Ευχαριστώ πολύ. ;)

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες