PHP Problem beim ausgeben von Arrays über Funktionen

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
565
hallo zusammen,

innerhalb meiner "cms" seite rufe ich eine funktion auf, die mir den gesammten inhalt der tabelle holt.
in spalte: "tag_cloud" stehen die ids für die "tag_namen". diese versuche ich innerhalb der while-schleife zu ermitteln.
Dafür rufe ich die Funktion "Number_To_Tag_Name" auf.

Das ganze sieht dann wie folgt aus:

PHP:
    public function Content_Pull() {
        $content_array = "";

        $db_result = $this->database->runSQLQuery("
        SELECT *,
        DATE_FORMAT(date, '%d.%m.%Y') AS date_format,
        DATE_FORMAT(date, '%H:%i:%s') AS time_format FROM ".GLOBAL_CONTENT_DB."
        ORDER by date DESC");
        while($row = mysql_fetch_array($db_result, MYSQL_ASSOC)) {

            // umwandeln der tags (1,2,3,4,5 ...) in dazugehörige namen
            $tag_array = $this->Number_To_Tag_Name($row['tag_cloud']);

            $comments_count = mysql_num_rows($this->database->runSQLQuery("SELECT * FROM ".GLOBAL_COMMENTS_DB." WHERE id_content LIKE '".$row['id']."' AND state = '1' "));
            $author_name = $this -> Pull_Author_Name($row['id_author']);
            $content_array[] = array(
                'id' => $row['id'],
                'author_name' => $author_name,
                'headline' => $row['headline'],
                'date' => $row['date_format'],
                'time' => $row['time_format'],
                'content' => $row['content'],
                'state' => $row['state'],
                'comments' => $comments_count,
                'tag_array' => $tag_array,
            );
        }
        return $content_array;
    }

Die entsprechende Number_To_Tag_Name sieht so aus:
PHP:
    public function Number_To_Tag_Name($tag_id) {
        $tag_array = "";
        $tag = preg_split('(,)', $tag_id);
        for($x=0; $x<count($tag); $x++) {
            $db_result = $this->database->runSQLQuery("SELECT * FROM ".GLOBAL_TAG_DB." WHERE id = '".$tag[$x]."'");
            while($row = mysql_fetch_array($db_result, MYSQL_ASSOC)) {
                $tag_array[] = array(
                    'tag_name' => $row['tag_name'],
                );
            }
        }
        return $tag_array;
    }

Als Beispiel steht in "tag_cloud": 1,2,3
Die Ausgabe bleibt jedoch bei Array,Array,Array

Ausgeben sollte er jedoch: Test1, Test2, Test3

Mir raucht jedoch der Kopf und ich weiß nicht warum?
Über hilfe würd ich mich wie immer freuen ;)

Vorweg: Danke!
 
erstemal methoden/funktion namen schreibt man im camelCase und wenn im sneak_case dann klein.. sieht richtig daneben aus ;) dann zweites.. ist das schon fast ein verbrechen werte nicht atomar in der datenbank zu speichern.. preg_split ists eit php 5.3 deprecated also spätestens seit 5.4 kein teil von php
.. versuchs einfach mit split .. wieso initialisierst du tag_array (was auch im camelCase sein sollte) als string und nicht als array() ?
 
Wie sieht den die Ausgabe von var_dump($tag_array) nach der Funktion Number_To_Tag_Name aus?
 
var_dump liefert:

array(3) { [0]=> array(1) { ["tag_name"]=> string(5) "Test1" } [1]=> array(1) { ["tag_name"]=> string(5) "Test2" } [2]=> array(1) { ["tag_name"]=> string(5) "Test3" } }
 
Die Funktion wird an content_array gebunden und dann durch die index.html dargestellt:

PHP:
                $tpl->assign('content_array', $data->Content_Pull());
                $tpl->display('index.html');

index.html:
PHP:
<div id="main">
    <div id="content">
        <div id="testimonials">
        <? for($x=0; $x<count($TPL['content_array']); $x++): ?>
            <? if($TPL['content_array'][$x]['state'] > "0") { ?>
            <h3><?=$TPL['content_array'][$x]['headline']?></h3>
            <div class="testimonial">
                <p>
                    <em><?=$TPL['content_array'][$x]['date']?> <?=$TPL['content_array'][$x]['time']?> | Author: <?=$TPL['content_array'][$x]['author_name']?></em><br />
                    <span class="author"><?=nl2br($this->linker->Change_Links($TPL['content_array'][$x]['content']))?></span>
                    <br />
                    <em>Kommentare: <a href="?nav=comments&id=<?=$TPL['content_array'][$x]['id']?>"> <?=$TPL['content_array'][$x]['comments']?> </a></em><br />
                    Tags: <?=$TPL['content_array'][$x]['tag_array']?>
                </p>
            </div>
            <? } ?>
            <? endfor; ?>
        </div>
    </div>
</div>
 
Du erzeugst ein Mehrdimensionale Array daher bekommst Du als Ausgabe Array,Array,... brauchst Du das so?

Ansonsten sollte dafür auch

$tag_array[] = $row['tag_name'];

reichen.
 
$TPL['content_array'][$x]['tag_array'] ist ein Array, siehst du ja an var_dump, da kann PHP nix anderes machen.
Geb das einfach mal mit ner zweiten Schleife aus, dann sollte das Problem gelöst sein.
Code:
Tags: <? foreach($TPL['content_array'][$x]['tag_array'] as $t)echo $t['tag_name'];?>
 
@Hancock: danke ... das funktioniert!

@Daichi: sieht einfacher aus, hat aber leider nicht funktioniert, bekomme dann nur noch 1 array als output.
 
Stimmt die Definition der Variable hab ich übersehen, die sollte wie Hancock schon sagte auf Array gesetzt werden, das solltest Du im ersten Skript in Zeile 2 auch machen $content_array = array();
 
danke, werde ich mir morgen nochmal anschauen, wenn der kopf wieder etwas freier ist und die kopfschmerzen weg sind ;)
 
Hallo,

ich muss das Thema leider nochmal auffrischen. Das eigentliche Problem hat sich gelöst - in der Übersicht meiner Content Einträge werden nun auch die Tags ausgegeben - sehr gut!

Nun möchte ich aber meinen Beitrag bearbeiten und hier entsprechend die Tags anpassen bzw neu setzen.

Mein Template zum darstellen des zu editierenden Beitrags sieht so ausL

PHP:
<? if(!isset($_SESSION['login'])) {
header('Location: ?');
} else { ?>
<div id="main">
    <div id="content">
        <div id="testimonials">
            <h3>Admin CP - edit content</h3>
            <div class="testimonial">
                <p>
                <form accept-charset="utf-8" method="post" action="?nav=admin_content_push_edit">

                Tag Cloud: <br />
                <? for($x=0; $x<count($TPL['tag_array']); $x++): ?>
                    <input type="checkbox" name="checkbox[]" value="<?=$TPL['tag_array'][$x]['id']?>"> <?=$TPL['tag_array'][$x]['tag_name']?>
                <? endfor; ?>

                <br />

                <? for($x=0; $x<count($TPL['pull_content_array']); $x++): ?>

                <input type="hidden" name="id" value="<?=$TPL['pull_content_array'][$x]['id']?>"><br />
                Headline <input type="text" name="headline" value="<?=$TPL['pull_content_array'][$x]['headline']?>" autocomplete="off"><br />
                Eintrag<br />

                        <textarea name="content" cols="50" rows="8" autocomplete="off"><?=$TPL['pull_content_array'][$x]['content']?></textarea>
                        <br />
                        <select name="state_id">
                            <option value="<?=$TPL['pull_content_array'][$x]['state']?>" selected><?=$TPL['pull_content_array'][$x]['state_name']?> (selected)</option>

                            <? for($x=0; $x<count($TPL['state_pull_array']); $x++): ?>
                            <option value="<?=$TPL['state_pull_array'][$x]['state_id']?>"><?=$TPL['state_pull_array'][$x]['state_name']?></option>
                            <? endfor; ?>
                        </select>
                        <input type="submit" value=" Absenden ">
                    </form>
                <? endfor; ?>
                </p>
            </div>
        </div>
    </div>
    <? } ?>

also 2 for schleifen, einmal zum darstellen der tags und einmal zum darstellen des beitrags innerhalb einer form.

mein problem ist nun: ich kriege es nicht hin, die checkboxen mit den werten aus der datenbank, die gesetzt sind, vor zu selektieren.

eigentlich müsste ich nochmal eine for-schleife innerhalb der for-schleife setzen. ich denke aber mal wieder zu kompliziert?

anbei noch meine funcktion zum holen aller benötigter infos.
in "tag_cloud" sind die gesetzten tags enthalten im format: 1,2,3,7,8,9....

PHP:
    public function Content_Pull_Data($id) {
        $content_array = "";

        $db_result = $this->database->runSQLQuery("
        SELECT *,
        DATE_FORMAT(date, '%d.%m.%Y') AS date_format,
        DATE_FORMAT(date, '%H:%i:%s') AS time_format FROM ".GLOBAL_CONTENT_DB."
        WHERE id = ".$id."
        ORDER by date DESC");
        while($row = mysql_fetch_array($db_result, MYSQL_ASSOC)) {
            $state_name = $this -> Pull_State_Name($row['state']);
            $author_name = $this -> Pull_Author_Name($row['id_author']);
            $content_array[] = array(
                'id' => $row['id'],
                'author_name' => $author_name,
                'headline' => $row['headline'],
                'date' => $row['date_format'],
                'time' => $row['time_format'],
                'content' => $row['content'],
                'state' => $row['state'],
                'state_name' => $state_name,
                'tag_array' => $row['tag_cloud'],
            );
        }
        return $content_array;
    }
 
In der Zeile 14

<input type="checkbox" name="checkbox[]" value="<?=$TPL['tag_array'][$x]['id']?>"> <?=$TPL['tag_array'][$x]['tag_name']?>

müsste der Zusatz 'checked' bei der passenden Checkbox hinzugefügt werden, damit diese als ausgewählt angezeigt wird.

Du must also noch einen Prüfung einbauen ob der laufende $x-Wert gerade $TPL['tag_array'][$x]['tag_name'] entspricht und wenn ja dann das checked setzen.
 
Zurück
Oben