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

Ερώτηση σχετικά με array unique σε PHP


rafinos

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

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

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

Έχω δύο μονοδιάστατα arrays που κάθε κελί του ενός συμβαδίζει με το κελί του άλλου. Π.χ. στον έναν πίνακα έχω ερωτήσεις και στον άλλο έχω τις απαντήσεις. 

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

Υπάρχει τρόπος να κάνω unique τον πίνακα τον απαντήσεων και να γίνουν παράλληλα οι αλλαγές και στον άλλο πίνακα;

Ή έστω να γίνει ένας multidimensional πίνακας δεν υπάρχει θέμα. 

Ένα παράδειγμα:

Πίνακας Α
1. Πόσο κάνει 1+1; 
2. Πόσο κάνει 2*1;
3. Πόσο κάνει 5+5;
4. Πόσο κάνει 4/2;

Πίνακας Β
1. 2
2. 2
3. 10
4. 2


Οι απαντήσεις των ερωτήσεων 1,2 και 4 έχουν ίδια απάντηση. Θέλω να μείνει μία από αυτές (δεν με νοιάζει ποια) και η μία απάντηση από τις 3ις. 

 

Ενημέρωση
Παιδιά δοκίμασα το εξής και νομίζω ότι μου δουλεύει, αλλά για πείτε μου και τι γνώμη σας.
 

$data = array();
for($i=0; $i<$len; $i++){
	if(!isset($data[$answers[$i]])){ 
    	$data[$answers[$i]] = $questions[$i];
    }
}

Εννοείται ότι οι πίνακες $answers και $questions είναι ίδιου μεγέθους και συμβαδίζουν. 

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

  • Moderators

Δεν καταλαβαίνω γιατί να θέλεις να κάνεις κάτι τέτοιο. Στον κώδικα που έγραψες, η τιμή του $data[$answers[$i]] θα αλλάζει κάθε φορά που θα βρίσκει μια ερώτηση με ίδια απάντηση. Στο τέλος τι ακριβώς περιμένεις να έχει το $data; Αν θες να πάρεις τις μοναδικές απαντήσεις, υπάρχει η array_unique.

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

Η array_unique θα πάρει ως όρισμα τον πίνακα answers και θα το κάνει να έχει μοναδικές τιμές. Ο πίνακας questions θα έχει περισσότερες ερωτήσεις και θα μπορεί να γίνει το ζευγάρωμα. 

Αν έχεις στο μυαλό σου ότι αυτό μπορεί να γίνει αλλιώς και να υπάρχει κάποιο id για την κάθε ερώτηση κτλ για να σε προλάβω θα πω ότι δεν θέλω να πετύχω κάτι τέτοιο. Θέλω να εξάγω αρχείο που να έχει την ερώτηση και δίπλα την απάντηση. Οπότε θέλω να πετύχω unique στις απαντήσεις και ταυτόχρονα unset τα ίδια κελιά και στους δύο πίνακες. 


Επίσης, ο κώδικας που έγραψα κάνει ακριβώς το αντίθετο από αυτό που είπες και άρα κάνει αυτό που θέλω. Όταν βρίσκει ίδια απάντηση δεν μπαίνει στην if με αποτέλεσμα να μην προστίθεται στον πίνακα data καμία απάντηση παραπάνω από μία φορά (ως key) και ως εκ τούτου ούτε και ερώτηση ως value. 

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

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

Κάτσε γιατί κάτι δεν έχω καταλάβει. Αν τρέξω αυτό

<?php

$questions = [
    'Πόσο κάνει 1+1;',
    'Πόσο κάνει 2*1;',
    'Πόσο κάνει 5+5;',
    'Πόσο κάνει 4/2;',
];

$answers = [
    2,
    2,
    10,
    2,
];

$data = array();
$len = count($questions);
for($i = 0; $i < $len; $i++) {
	if(!isset($data[$answers[$i]])){ 
    	$data[$answers[$i]] = $questions[$i];
    }
}

var_dump($data);

θα πάρω αυτό

 array(2) {
  [2]=>
  string(24) "Πόσο κάνει 1+1;"
  [10]=>
  string(24) "Πόσο κάνει 5+5;"
}

Λες ότι το αρχείο που θες να φτιάξεις θα έχει όλες τις ερωτήσεις και δίπλα από κάθε ερώτηση την κατάλληλη απάντηση. Βλέπεις όμως ότι στο $data χάνεις μέρος των ερωτήσεων. Είναι αργά τώρα και ίσως να μου διαφεύγει κάτι, αλλά δε γίνεται να έχεις έναν πίνακα που θα έχει τις μοναδικές απαντήσεις και με κάποιο τρόπο να μπορέσεις να τις αντιστοιχίσεις σε ερωτήσεις χωρίς να αποθηκεύσεις επιπλέον πληροφορία κάπου.

Αν δε σε νοιάζει ποια ερώτηση θα αντιστοιχίσεις στη μοναδική απάντηση, τότε μπορείς να χρησιμοποιήσεις την array_combine.

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

Δημοσ. (επεξεργασμένο)
35 λεπτά πριν, Kercyn είπε

Κάτσε γιατί κάτι δεν έχω καταλάβει. Αν τρέξω αυτό




<?php

$questions = [
    'Πόσο κάνει 1+1;',
    'Πόσο κάνει 2*1;',
    'Πόσο κάνει 5+5;',
    'Πόσο κάνει 4/2;',
];

$answers = [
    2,
    2,
    10,
    2,
];

$data = array();
$len = count($questions);
for($i = 0; $i < $len; $i++) {
	if(!isset($data[$answers[$i]])){ 
    	$data[$answers[$i]] = $questions[$i];
    }
}

var_dump($data);

θα πάρω αυτό




 array(2) {
  [2]=>
  string(24) "Πόσο κάνει 1+1;"
  [10]=>
  string(24) "Πόσο κάνει 5+5;"
}

Λες ότι το αρχείο που θες να φτιάξεις θα έχει όλες τις ερωτήσεις και δίπλα από κάθε ερώτηση την κατάλληλη απάντηση. Βλέπεις όμως ότι στο $data χάνεις μέρος των ερωτήσεων. Είναι αργά τώρα και ίσως να μου διαφεύγει κάτι, αλλά δε γίνεται να έχεις έναν πίνακα που θα έχει τις μοναδικές απαντήσεις και με κάποιο τρόπο να μπορέσεις να τις αντιστοιχίσεις σε ερωτήσεις χωρίς να αποθηκεύσεις επιπλέον πληροφορία κάπου.

Αν δε σε νοιάζει ποια ερώτηση θα αντιστοιχίσεις στη μοναδική απάντηση, τότε μπορείς να χρησιμοποιήσεις την array_combine.

Η απάντηση που θα πάρεις με τον κώδικα που αναφέρεις είναι ακριβώς αυτή που παρέθεσες. Η ερώτηση με την απάντηση που θέλω πρέπει να συμβαδίζουν. Δηλαδή η απάντηση να αντιστοιχεί στην ερώτηση. 

Ο κώδικας που παρέθεσα μου έλυσε το θέμα, απλά δεν καταλαβαίνω τι σε μπερδεύει. Αφού η if λέει ξεκάθαρα ότι μπαίνεις στην if όταν δεν υπάρχει το key. Επομένως αν υπάρχει ήδη δεν μπαίνεις. 

Είδες που σου απάντησα στο ερώτημα σχετικά με την αντιστοιχία (εκεί που λέω για ids) πριν καν το κάνεις;

Δεν θέλω να πετύχω τίποτα που να χρησιμοποιείται από την php. Μετατροπή σε αρχείο κάνω γιατί είναι τεράστιο και δεν γίνεται χειροκίνητα με τίποτα. Παίρνω δεδομένα και τα εξάγω σε μια τελείως διαφορετική μορφή, αλλά το αρχικό αρχείο έχει dublicates στις απαντήσεις (με διαφορετική ερώτηση) το οποίο και δεν επιθυμώ. 

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

  • Moderators

Ωραία, άρα από τη στιγμή που δε σε νοιάζει να χάσεις πληροφορία από τις ερωτήσεις, το array_combine που έγραψα πιο πάνω σου κάνει.

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

Δημοσ. (επεξεργασμένο)
2 ώρες πριν, Kercyn είπε

Ωραία, άρα από τη στιγμή που δε σε νοιάζει να χάσεις πληροφορία από τις ερωτήσεις, το array_combine που έγραψα πιο πάνω σου κάνει.

Μα δεν θέλω να γίνει κανένας πίνακας combine. Έχω 1 πίνακα με answers που έχει dublicates. Θέλω να γίνει ο πίνακας unique. Απλά οι ερωτήσεις είναι σε άλλον πίνακα που έχει τις ερωτήσεις ακριβώς στα αντίστοιχα indexes. Όταν γίνει το unique που πίνακα answers τότε ο πίνακας questions θα έχει παραπάνω κελιά και θα δημιουργηθεί μπάχαλο. Οπότε θέλω την ώρα που γίνεται ο έλεγχος για τα duplicates στον έναν πίνακα, την ώρα που θα διαγραφεί ένα κελί με index = n στον πίνακα answers να γίνει το ίδιο και στον πίνακα questions στο κελί με index = n. 

Νομίζω ότι έχεις παρανοήσει λίγο σχετικά με το τι θέλω να κάνω. Μπορεί να μην τα εξηγώ και εγώ καλά δεν ξέρω. 

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

  • Moderators

Παραπάνω έχεις βάλει ένα κομμάτι κώδικα που λες ότι κάνει αυτό που θες. Στο snippet το δικό μου, που χρησιμοποιεί τον κώδικά σου, βγάζει ένα αποτέλεσμα που λες ότι είναι αποδεκτό. Αυτό που λέω είναι ότι αντί να χρησιμοποιήσεις τον κώδικα, μπορείς να το κάνεις πιο απλά με την array_combine. Για παράδειγμα:

<?php

$questions = [
    'Πόσο κάνει 1+1;',
    'Πόσο κάνει 2*1;',
    'Πόσο κάνει 5+5;',
    'Πόσο κάνει 4/2;',
];

$answers = [
    2,
    2,
    10,
    2,
];

$data = array_combine($answers, $questions);

var_dump($data);

Αυτό θα σου δώσει το αποτέλεσμα:

 array(2) {
  [2]=>
  string(24) "Πόσο κάνει 4/2;"
  [10]=>
  string(24) "Πόσο κάνει 5+5;"
}

Το οποίο, απ' ό,τι λες, είναι αποδεκτό.

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

1 ώρα πριν, Kercyn είπε

Παραπάνω έχεις βάλει ένα κομμάτι κώδικα που λες ότι κάνει αυτό που θες. Στο snippet το δικό μου, που χρησιμοποιεί τον κώδικά σου, βγάζει ένα αποτέλεσμα που λες ότι είναι αποδεκτό. Αυτό που λέω είναι ότι αντί να χρησιμοποιήσεις τον κώδικα, μπορείς να το κάνεις πιο απλά με την array_combine. Για παράδειγμα:


<?php

$questions = [
    'Πόσο κάνει 1+1;',
    'Πόσο κάνει 2*1;',
    'Πόσο κάνει 5+5;',
    'Πόσο κάνει 4/2;',
];

$answers = [
    2,
    2,
    10,
    2,
];

$data = array_combine($answers, $questions);

var_dump($data);

Αυτό θα σου δώσει το αποτέλεσμα:


 array(2) {
  [2]=>
  string(24) "Πόσο κάνει 4/2;"
  [10]=>
  string(24) "Πόσο κάνει 5+5;"
}

Το οποίο, απ' ό,τι λες, είναι αποδεκτό.

Οκ, άρα με την array_combine γίνονται παράλληλα unique τα keys του πίνακα. Οκ! Thanks! :)

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

Επίσης αφαιρόντας τη συνθήκη από τον αρχικό σου κώδικα κάνει αυτό που κάνει και η array_combine δηλαδή αυτό

$data = array();
$len = count($questions);
for($i = 0; $i < $len; $i++) 
   $data[$answers[$i]] = $questions[$i];
   

όποτε βρίσκει το ίδιο κλειδί με άλλο value ανανεώνει το value

 

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

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

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

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

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

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

Σύνδεση

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

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