Δυναμικη εισαγωγη διαστασεων σε πινακα

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

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

Απάντηση
Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Δυναμικη εισαγωγη διαστασεων σε πινακα

Δημοσίευση από Christianago » 04 Ιουν 2012 00:43

Υπαρχει καποιος τροπος να αρχικοποιησεις εναν πολυδιαστατο πινακα δυναμικα;

Εχω τον παρακατω κωδικα, κανει τη μιση δουλεια:

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

for&#40;$i = 0; $i < $numDimensions; $i++&#41;&#123; 
$array1&#91;&#93; = array&#40;1, 1, 1, 1&#41;;
&#125;
Η προταση $array1[] = array(1, 1, 1, 1); δημιουργει εναν 4-διαστατο πινακα
ενω πχ. η προταση $array1[] = array(1, 1, 1, 1, 1); εναν 5-διαστατο.
Μπορουμε να αντικαταστησουμε τους ασσους με μια πιο δυναμικη προταση,
για το λογο οτι τις διαστασεις του πινακα δεν τις ξερω παντα.

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Δυναμικη εισαγωγη διαστασεων σε πινακα

Δημοσίευση από jpk » 04 Ιουν 2012 21:12

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

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Δυναμικη εισαγωγη διαστασεων σε πινακα

Δημοσίευση από dva_dev » 04 Ιουν 2012 21:28

Christianago έγραψε:Η προταση $array1[] = array(1, 1, 1, 1); δημιουργει εναν 4-διαστατο πινακα
ενω πχ. η προταση $array1[] = array(1, 1, 1, 1, 1); εναν 5-διαστατο.
Και τα δύο φτιάχνουν μονοδιάστατο πίνακα. Το όλο loop φτιάχνει διδιάστατο.

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Δυναμικη εισαγωγη διαστασεων σε πινακα

Δημοσίευση από Christianago » 04 Ιουν 2012 21:54

Εχει δικιο ο dvd_dev + εκανα λαθος την ερωτηση. Ας πουμε οτι το $numDimensions ειναι 4.
Θελω με απλα λογια να καθοριζω και να γεμιζω δυναμικα τις στηλες του πινακα, ο οποιος καθε φορα θα ειναι τετραγωνικος.
Δηλ. η προταση:

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

for&#40;$i = 0; $i < 4; $i++&#41;&#123;
$array1&#91;&#93; = array&#40;1, 1, 1, 1&#41;;
&#125;
δημιουργει εναν 2-διαστατο πινακα 4x4. Επειδη δεν ξερω τις στηλες του πινακα υπαρχει καποιος τροπος
ωστε να μη γραφω τους ασσους σε αυτην την προταση: $array1[] = array(1, 1, 1, 1);
Οι 4 ασσοι μπηκαν επιτηδες αφου στο παραδειγμα ξερω οτι θα δημιουργηθει 4x4 πινακας.

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

Δυναμικη εισαγωγη διαστασεων σε πινακα

Δημοσίευση από gvre » 04 Ιουν 2012 22:50

Τί εννοείς όταν λες "να γεμιζω δυναμικα τις στηλες του πινακα"; Θέλεις σε κάθε περίπτωση ο πίνακας NxN να έχει περιεχόμενα άσσους, ή κάτι άλλο;

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Δυναμικη εισαγωγη διαστασεων σε πινακα

Δημοσίευση από Christianago » 04 Ιουν 2012 23:14

Το ζητουμενο ειναι να δημιουργω καθε φορα εναν τετραγωνικο πινακα (ή αλγεβρικα μήτρα) γνωριζοντας μονο το ποσες γραμμες θα εχει.
Δεν ενδιαφερει το περιεχομενο-οι τιμες του πινακα-ας ειναι για παραδειγμα null.
Πχ. το $numDimensions (το ονομα της μεταβλητης ειναι ατυχες σε αυτην την περιπτωση) ειναι 4 σε μια εκτελεση του προγραμματος.
Πως γινεται να φτιαξω δυναμικα τον πινακα εχοντας την εξης δομη:

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

$array1 = array&#40;
               array&#40; null, null, null, null&#41;,
               array&#40; null, null, null, null&#41;,
               array&#40; null, null, null, null&#41;,
               array&#40; null, null, null, null&#41;
               &#41;; 

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

Δυναμικη εισαγωγη διαστασεων σε πινακα

Δημοσίευση από gvre » 04 Ιουν 2012 23:24

Ένας απλός τρόπος να το κάνεις είναι ο παρακάτω (δεν έχω προσθέσει ελέγχους). Αν θέλεις κάτι πιο επεκτάσιμο, μπορείς να φτιάξεις μια κλάση, η οποία θα κάνει και άλλα πράγματα.

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

function matrix&#40;$dimensions&#41;
&#123;
        $matrix = array&#40;&#41;;
        for &#40;$i = 0; $i < $dimensions; ++$i&#41;
                for &#40;$j = 0; $j < $dimensions; ++$j&#41;
                        $matrix&#91;$i&#93;&#91;$j&#93; = null;
        return $matrix;
&#125;

$matrix = matrix&#40;4&#41;;

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Δυναμικη εισαγωγη διαστασεων σε πινακα

Δημοσίευση από Christianago » 04 Ιουν 2012 23:38

Ναι αυτο ακριβως εψαχνα. Σε ευχαριστω. Για την ακριβεια εχω φτιαξει μια κλαση οπου γινονται διαφορες αλγεβρικες πραξεις,
κι ειχα ξεχασει το πλεον βασικο παραγοντα, το οτι μπορει να δινει αριθμων γραμμων και στηλων ο χρηστης ως εισοδο για μια μητρα...

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

Δυναμικη εισαγωγη διαστασεων σε πινακα

Δημοσίευση από gvre » 04 Ιουν 2012 23:45

Αν δεν περνάς τιμές στον πίνακα δεν έχει νόημα να τον δημιουργείς. Μπορείς να περνάς στον constructor τις διαστάσεις του, να τις αποθηκεύεις σε properties της κλάσης και να τον δημιουργείς όταν χρειαστεί να τον γεμίσεις. Μπορείς να έχεις και ένα flag μέσω του οποίου θα βλέπεις αν έχει αρχικοποιηθεί ο πίνακας (για να μην κάνεις πράξεις με μη αρχικοποιημένο πίνακα).

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Δυναμικη εισαγωγη διαστασεων σε πινακα

Δημοσίευση από Christianago » 04 Ιουν 2012 23:51

Εχεις δικιο ενας null πινακας ειναι αχρηστος. Τις τιμες του πινακα τις παιρνω ευκολα απο το χρηστη μεσω textboxes,
οπου καθε ενα εχει id ενα σημειο του πινακα, πχ. το 2x3 (γραμμη και στηλη μητρας).

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

Δυναμικη εισαγωγη διαστασεων σε πινακα

Δημοσίευση από gvre » 05 Ιουν 2012 11:17

Τώρα που το ξαναβλέπω, ένας αρχικοποιημένος με null πίνακας σου κάνει τη ζωή λίγο ευκολότερη όταν θέλεις να ελέγξεις αν είναι γεμάτος-έτοιμος για πράξεις. Μπορείς να "πατήσεις" σε κάτι σαν το παρακάτω και να προσθέσεις ό,τι άλλο χρειάζεσαι.

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

class Matrix
&#123;
        private $_matrix  = array&#40;&#41;;
        private $_isReady = false;
        private $_rows = null;
        private $_cols = null;
        
        const MAX_DIMENSION = 5;

        public function __construct&#40;$rows, $cols&#41;
        &#123;
                $rows = &#40;int&#41;$rows;
                $cols = &#40;int&#41;$cols;

                if &#40;$rows < 1 || $cols < 1 || $rows > self&#58;&#58;MAX_DIMENSION || $cols > self&#58;&#58;MAX_DIMENSION&#41;
                        throw new RangeException&#40;"Invalid dimensions"&#41;;

                $this->_rows = $rows;
                $this->_cols = $cols;

                for &#40;$i = 0; $i < $rows; ++$i&#41;
                        for &#40;$j = 0; $j < $cols; ++$j&#41;
                                $this->_matrix&#91;$i&#93;&#91;$j&#93; = null;
        &#125;

        public function isReady&#40;&#41;
        &#123;
                if &#40;$this->_isReady&#41;
                        return true;

                for &#40;$i = 0; $i < $this->_rows; ++$i&#41;
                        if &#40;array_search&#40;null, $this->_matrix&#91;$i&#93;, true&#41; !== false&#41;
                                return false;

                return $this->_isReady = true;
        &#125;
&#125;


try &#123;
        $matrix = new Matrix&#40;3, 3&#41;;
&#125; catch &#40;RangeException $e&#41; &#123;
        echo $e->getMessage&#40;&#41;;
&#125;

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Δυναμικη εισαγωγη διαστασεων σε πινακα

Δημοσίευση από jpk » 05 Ιουν 2012 12:18

Σχετικά άσχετο , και δεν στην λέω gvre αλλά το underscore μπροστά από τις ιδιότητες πού κολλάει; Κληρονομία από την PHP4 ;

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

Δυναμικη εισαγωγη διαστασεων σε πινακα

Δημοσίευση από gvre » 05 Ιουν 2012 13:27

Είναι prefix για να υπενθυμίζει ότι η μεταβλητή είναι private (αυτό το ξέρεις ήδη). Στα νέα projects το έχω καταργήσει. Από εδώ μπορεί να αφαιρεθεί χωρίς ενδοιασμούς :)

Το standard coding style είναι κάτι το οποίο λείπει από την php. Πιστεύω ότι σε λίγο καιρό θα οριστικοποιηθεί το PSR-2, οπότε θα μπορούμε να γράφουμε όλοι με το ίδιο στυλ.

Απάντηση

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

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

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