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

Πίνακας με διπλότυπα...


rafinos

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

Γεια σας παιδιά!

 

Θέλω να τσεκάρω αν σε ένα array της javascript υπάρχουν διπλότυπα (δύο φορές η ίδια τιμή) και αν ναι να εμφανίσω τις τιμές που υπάρχουν παραπάνω από μία φορές....

 

Για παράδειγμα αν στον πίνακα έχω

 

array("4","4","1","2","5","1","4")...

Να εμφανιστούν το 4 και το 5 ...

 

Ξέρει κανείς κάποιο τρόπο

(και με jquery δεν υπάρχει θέμα).

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

Βασικά περνάω την τιμή από μια λίστα με textboxes στον πίνακα για να τσεκάρω αν προσπαθεί να στείλει ο χρήστης δύο φορές την ίδια εγγραφή ... ώστε να μην τον αφήσω :P

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

Τότε μπορείς να χρησιμοποιήσεις την inArray. Αν η τιμή που ελέγχεις υπάρχει στον πίνακα θα σου επιστρέψει το index της, αλλιώς θα σου επιστρέψει -1, για παράδειγμα:

var testArray = ['value1', 'value2', 'value4'];

$.inArray('value1', testArray) //επιστρέφει 0
$.inArray('value2', testArray) //επιστρέφει 1
$.inArray('value3', testArray) //επιστρέφει -1
$.inArray('value4', testArray) //επιστρέφει 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...

Έχω αυτό σε Php

for($i=0; $i<count($_POST['choices']); $i++){
	$choices[$i][0] = $_POST['choices'][$i];
	$choices[$i][1] = $_POST['rates'][$i];
}

*τα choices και τα rates έχουν ίδιο length και είναι σε αντιστοιχία οπότε μη σας μπερδεύει...

 

Αυτό που θέλω είναι...

Μετά το γέμισμα του πίνακα που κάνω παραπάνω ... αν στο [$i][0] υπάρχει η ίδια τιμή παραπάνω από μία φορές τότε να προστεθούν τα rates τους... δηλαδή [$i][1] = [$i][1] + [$i+x][1] και η τιμή που υπάρχει παραπάνω από μία φορά στον πίνακα να μείνει μόνο μία φορα.

 

Καταλάβατε τι εννοώ γιατί έτσι όπως το είπα έγινε αχταρμάς :P

Θέλω δηλαδή array_unique() σε δισδιάστατο πίνακα αλλά με πρόσθεση του δεύτερου κελιού...

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

Δήλωσε έναν νέο πίνακα πχ $uchoices.

Για κάθε στοιχείο του $choices, αν υπάρχει στον $uchoices τότε συσσώρευσε (+=) το [1] του, αλλιώς βάλτο σαν νέο στοιχείο.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γιατί να κάνεις πίνακες του στυλ [0 => choice, 1 => rate] αντί να κάνεις ένα μόνο πίνακα της μορφής [choice1 => rate1, ...]? Θα ήταν πολύ βολικότερο.

 

Κατά τα άλλα γι' αυτό που θες η PHP δεν έχει τίποτα, οπότε είτε γράφεις μια γενικής χρήσης function για να κάνεις group by σε πίνακες είτε manually όπως λέει ο geomagas, πχ:

$results = [];
foreach ($_POST['choices'] as $i => $choice) {
    if (isset($results[$choice])) {
        $results[$choice] += $_POST['rates'][$i];
    }
    else {
        $results[$choice] = $_POST['rates'][$i];
    }
}
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το παράδειγμα που μου γράφεις παραπάνω δημιουργεί πίνακα της μορφής που μου πρότεινες έτσι;

Αν ναι... πως μπορώ να χρησιμοποιήσω την τιμή του key σαν μεταβλητή; :P

 

έτσι;

foreach($results as $key => $value){
    bla bla bla
}

Και όταν θέλω την τιμή του key θα βάζω $key και το όταν θέλω το αντίστοιχω $rate το $value;

 

 

ΟΚ!!!!!!!!!! Το έκανα ευχαριστώ πάααααααρα πολύ!!!!! :)

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

 

Κατά τα άλλα γι' αυτό που θες η PHP δεν έχει τίποτα, οπότε είτε γράφεις μια γενικής χρήσης function για να κάνεις group by σε πίνακες είτε manually όπως λέει ο geomagas, πχ:

$results = [];
foreach ($_POST['choices'] as $i => $choice) {
    if (isset($results[$choice])) {
        $results[$choice] += $_POST['rates'][$i];
    }
    else {
        $results[$choice] = $_POST['rates'][$i];
    }
}

 

Αυτο δεν θα ηταν αρκετο σε οποιαδήποτε ανάλογη περίπτωση? (ρωτάω γιατί δεν είμαι σίγουρος αν κάποιες php versions ή error reporting settings παραπονεθούν..?)

$results = [];
foreach ($_POST['choices'] as $i => $choice) {
   $results[$choice] += $_POST['rates'][$i];
}
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θα είχε το ίδιο τελικό αποτέλεσμα όσον αφορά τα $results αλλά θα έδινε E_NOTICE "undefined offset" την πρώτη φορά που συναντάει κάθε διαφορετικό $choice. Κώδικας που δίνει οποιοδήποτε notice ή warning αντικαθίσταται με άλλο ισοδύναμο που δεν δίνει. :)

 

Τώρα που το σκέφτομαι πάντως θα ήταν πιο sexy να γίνει έτσι:

$results = array_fill_keys($_POST['choices'], 0);
foreach ($_POST['choices'] as $i => $choice) {
    $results[$choice] += $_POST['rates'][$i];
}
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

Θα είχε το ίδιο τελικό αποτέλεσμα όσον αφορά τα $results αλλά θα έδινε E_NOTICE "undefined offset" την πρώτη φορά που συναντάει κάθε διαφορετικό $choice. Κώδικας που δίνει οποιοδήποτε notice ή warning αντικαθίσταται με άλλο ισοδύναμο που δεν δίνει. :)

 

Τώρα που το σκέφτομαι πάντως θα ήταν πιο sexy να γίνει έτσι:

$results = array_fill_keys($_POST['choices'], 0);
foreach ($_POST['choices'] as $i => $choice) {
    $results[$choice] += $_POST['rates'][$i];
}

Σε αυτή τη περίτπωση όμως τι γίνεται με τα ίδια κλειδιά (που δεν τα θέλουμε);

με την array_fill_keys() εξαλίφονται;

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

Δε γίνεται σε ένα πίνακα να υπάρχουν ίδια κλειδιά, οπότε το αποτέλεσμα της array_fill_keys είναι το ίδιο με το να έγραφες π.χ.

$arr = [0 => 42, 0 => 42];
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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

Χρησιμοποιούμε  cookies για να απολαμβάνεις το insomnia προσωποποιημένο στις ανάγκες σου αλλά και για την παροχή στοιχείων επισκεψιμότητας για να βελτιώσουμε την ποιότητα των υπηρεσιών μας