Προς το περιεχόμενο

Βελτίωση php function που φιλτράρει έναν array


philos

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Αντιμετωπίζω το εξής θέμα σε PHP script. Μην φρικάρετε, προέκυψε ύστερα από δοκιμές χτίσιμο - χτίσιμο :P

Έχω πετύχει αυτό που θέλω, όμως θέλω να το βελτιώσω ώστε να μην έχω τόσες συγκρίσεις.

Η συγκεκριμένη function παίρνει ως arguments έναν πίνακα με δεδομένα και τον φιλτράρει βάσει της $city. Το key 'onoma_sxolis' δεν έχει exact την πόλη, γι' αυτό κάνω strpos.

	public function processFilterSxoles($arr, $city)
	{
		$attika_cities = array('ΑΤΤΙΚΗ & ΠΕΙΡΑΙΑΣ', 'ΑΘΗΝΑ', 'ΑΙΓΑΛΕΩ', 'ΙΛΙΟΝ', 'ΠΕΙΡΑΙΑΣ');
		return array_filter($arr, function($var) use ($city, $attika_cities) 
								{ 
									return (strpos($var['onoma_sxolis'], $city) !== false 
											|| (
												(strpos($var['onoma_sxolis'], $attika_cities[0]) !== false || strpos($var['onoma_sxolis'], $attika_cities[1]) !== false || strpos($var['onoma_sxolis'], $attika_cities[2]) !== false || strpos($var['onoma_sxolis'], $attika_cities[3]) !== false || strpos($var['onoma_sxolis'], $attika_cities[4]) !== false) 
											&& in_array($city, $attika_cities))
											
											|| ($city == 'ΑΓΙΟΣ ΝΙΚΟΛΑΟΣ' && strpos($var['onoma_sxolis'], 'ΑΣΤΕΚ') !== false)
											|| ($city == 'ΡΟΔΟΣ' && strpos($var['onoma_sxolis'], 'ΑΣΤΕΡ') !== false)
											
											|| (strpos($var['idryma'], 'ΑΣΠΑΙΤΕ') !== false && in_array($city, $attika_cities))
											); 
								});		
	}

Επί της ευκαιρίας

- αν η $city είναι πόλη της Αττικής την κρατάει κι αυτήν, βάσει του $attika_cities.

- κάποιες επιπλέον εξαιρέσεις προσθέτονται (ΡΟΔΟΣ - ΑΣΤΕΡ) κτλ.

Τι θέλω να βελτιώσω:

1. Να αντικαταστήσω όλα τα:

strpos($var['onoma_sxolis'], $attika_cities[x]) !== false 

...με μια εντολή κώδικα κι όχι βάζοντας τα index.

2. Να αντικαταστήσω το:

|| ($city == 'ΑΓΙΟΣ ΝΙΚΟΛΑΟΣ' && strpos($var['onoma_sxolis'], 'ΑΣΤΕΚ') !== false)
|| ($city == 'ΡΟΔΟΣ' && strpos($var['onoma_sxolis'], 'ΑΣΤΕΡ') !== false)

... με μια εντολή κώδικα, χρησιμοποιώντας έναν array με δεδομένα όπως αυτόν:

$special_cases = ['ΑΓΙΟΣ ΝΙΚΟΛΑΟΣ' => 'ΑΣΤΕΚ', 'ΡΟΔΟΣ' => 'ΑΣΤΕΡ'];

Έτσι να μπορώ να βάζω όποιες εξαιρέσεις θέλω πιο άνετα.

Ίσως το πρόβλημα μπορεί να λυθεί με καμία preg_match αλλά δεν ξέρω regular expressions. :P

 

Επεξ/σία από philos
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

για το 1ο πχ μπορείς να πείς

foreach($attica_cities as $city)
{
	$ress = array_filter($arr, function($var){return strpos($var['onoma_sxolis'], $city) !== false;}) 
	array_merge($ola, $ress);
}

To $ola θα τα έχει στο τέλος όλα.

Το άλλο παρομοιώς με ένα foreach

foreach ($special_cities as $key = > $value)
{
	$result = array_filter($cities, function($var) {return $city == $key && strpos($var['onoma_sxolis'], $value) !== false;});
	array_merge($ola, $result);
	
}

Εάν το array είναι μεγάλο ίσως έτσι είναι πιο αργή η εκτέλεση

 

 

 

 

Επεξ/σία από k33theod
  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...