Daten vergleichen und bei Übereinstimmung nur einmal anzeigen

Versuch mal das bitte, es vergleicht PRODUCTS_NAME und filtert die doppelten raus.

Code:
function remove_dups($array, $row_element) {   
   $new_array[0] = $array[0];
   foreach ($array as $current) {
       $add_flag = 1;
       foreach ($new_array as $tmp) {
           if ($current[$row_element]==$tmp[$row_element]) {
               $add_flag = 0; break;
           }
       }
       if ($add_flag) $new_array[] = $current;
   }
   return $new_array;
}

$module_content = remove_dups($module_content,0);

{foreach name=aussen item=module_data from=$module_content}
<dl class="preview">
    <dd>
        {if $module_data.PRODUCTS_IMAGE!=''}
            <a href="{$module_data.PRODUCTS_LINK}">
                <img src="{$module_data.PRODUCTS_IMAGE}" alt="{$module_data.PRODUCTS_NAME}" />
            </a>
        {/if}
        <p class="shortdescreption">
            <strong>{$module_data.PRODUCTS_NAME}</strong><br />
            {$module_data.PRODUCTS_SHORT_DESCRIPTION|strip_tags|truncate:55:"...":true}<br />
            ab {$module_data.PRODUCTS_PRICE}<br />
        </p>
    </dd>
    <dd>
        <span>{$module_data.BUTTON_BUY_NOW}</span>
        <a href="{$module_data.PRODUCTS_LINK}" class="productlink">Details</a>
    </dd>
</dl>
{/foreach}

Marcus
 
Wenn wirklich alle elemente GLEICH sein müssen um gefiltert zu werden dann versuch das:

Code:
function remove_dup($matriz) {
   $aux_ini=array();
   $entrega=array();
   for($n=0;$n<count($matriz);$n++) {
     $aux_ini[]=serialize($matriz[$n]);
   }
   $mat=array_unique($aux_ini);
   for($n=0;$n<count($matriz);$n++) {
     $entrega[]=unserialize($mat[$n]);
   }
   foreach ($entrega as $key => $row){
     if (!is_array($row)) { unset($entrega[$key]); }
   }
   return $entrega;
}

$module_content = remove_dup($module_content);

{foreach name=aussen item=module_data from=$module_content}
<dl class="preview">
    <dd>
        {if $module_data.PRODUCTS_IMAGE!=''}
            <a href="{$module_data.PRODUCTS_LINK}">
                <img src="{$module_data.PRODUCTS_IMAGE}" alt="{$module_data.PRODUCTS_NAME}" />
            </a>
        {/if}
        <p class="shortdescreption">
            <strong>{$module_data.PRODUCTS_NAME}</strong><br />
            {$module_data.PRODUCTS_SHORT_DESCRIPTION|strip_tags|truncate:55:"...":true}<br />
            ab {$module_data.PRODUCTS_PRICE}<br />
        </p>
    </dd>
    <dd>
        <span>{$module_data.BUTTON_BUY_NOW}</span>
        <a href="{$module_data.PRODUCTS_LINK}" class="productlink">Details</a>
    </dd>
</dl>
{/foreach}

Das macht bei dir wahrscheinlich noch mehr sinn.

Es wandelt jedes Array_Item per serialize in einen kompletten String um, macht dann ein unique, und wandlet die nicht doppelten wieder zurück in ein array. Gefilter wird nur wenn alle Elemnte Identisch sind, bei der vorhergehenden Function die ich gepostet hatte wird nur das erste (0) Element geprüft.

Marcus
 
Hallo Marcus,

das hört sich super an nur habe ich das Problem das ich innerhalb der Smarty-Templatedatei alles was echter PHP Code ist auch zwischen { php }{/ php } packen muss.

Um den Code dann auch auf die foreach anweisung anwenden zu können müsste ich den Code in die PHP Datei Packen in der das Array zusammengebaut wird oder im Template die foreach Anweisung so umbauen, dass sie eine php foreach anweisung wird und nicht mehr smarty und das kann ich nicht :(

Kannst du mir sagen wie ich die foreach anweisung so umbauen kann das sie auch php fähig wird?

evtl. gibt es ja auch eine Lösung wie man die php Funktion mit der foreach anweisung verbinden kann ohne alles umzuschreiben?!

Im Template müsste ich es so anwenden:
PHP:
{php}
function remove_dup($matriz) {
   $aux_ini=array();
   $entrega=array();
   for($n=0;$n<count($matriz);$n++) {
     $aux_ini[]=serialize($matriz[$n]);
   }
   $mat=array_unique($aux_ini);
   for($n=0;$n<count($matriz);$n++) {
     $entrega[]=unserialize($mat[$n]);
   }
   foreach ($entrega as $key => $row){
     if (!is_array($row)) { unset($entrega[$key]); }
   }
   return $entrega;
}

$module_content = remove_dup($module_content);
{/php}

{foreach name=aussen item=module_data from=$module_content}
<dl class="preview">
    <dd>
        {if $module_data.PRODUCTS_IMAGE!=''}
            <a href="{$module_data.PRODUCTS_LINK}">
                <img src="{$module_data.PRODUCTS_IMAGE}" alt="{$module_data.PRODUCTS_NAME}" />
            </a>
        {/if}
        <p class="shortdescreption">
            <strong>{$module_data.PRODUCTS_NAME}</strong><br />
            {$module_data.PRODUCTS_SHORT_DESCRIPTION|strip_tags|truncate:55:"...":true}<br />
            ab {$module_data.PRODUCTS_PRICE}<br />
        </p>
    </dd>
    <dd>
        <span>{$module_data.BUTTON_BUY_NOW}</span>
        <a href="{$module_data.PRODUCTS_LINK}" class="productlink">Details</a>
    </dd>
</dl>
{/foreach}

Problem dabei ist nur das die Funktion, wie gesagt, nicht von der foreach Anweisung beachtet wird.
 
Hast du das denn mal ausprobiert?

Die foreach anweisung kommt ja nach dem php block, zu diesem Zeitpunkt sollte das Array bereits bereinigt sein.

Die foreach anweisung selber muss auf die function nicht mehr zu greifen, nur das array durchgehen, und das ist vorher bereinigt worden.

Am besten nochmal mit print_r ausgeben...

Marcus
 
es funktioniert leider nicht :(

PHP:
{php}

function remove_dups($array, $row_element) {   
   $new_array[0] = $array[0];
   foreach ($array as $current) {
       $add_flag = 1;
       foreach ($new_array as $tmp) {
           if ($current[$row_element]==$tmp[$row_element]) {
               $add_flag = 0; break;
           }
       }
       if ($add_flag) $new_array[] = $current;
   }
   return $new_array;
}
$module_content = remove_dups($module_content,0);

echo "<pre>";
print_r($module_content);
echo "</pre>";

{/php}

{foreach name=aussen item=module_data from=$module_content} 
<dl class="preview">
    <dd>
        {if $module_data.PRODUCTS_IMAGE!=''}
            <a href="{$module_data.PRODUCTS_LINK}">
                <img src="{$module_data.PRODUCTS_IMAGE}" alt="{$module_data.PRODUCTS_NAME}" />
            </a>
        {/if}
        <p class="shortdescreption">
            <strong>{$module_data.PRODUCTS_NAME}</strong><br />
            {$module_data.PRODUCTS_DESCRIPTION|strip_tags|truncate:55:"...":true}<br />
            ab {$module_data.PRODUCTS_PRICE}<br />
        </p>
    </dd>
    <dd>
        <span>{$module_data.BUTTON_BUY_NOW}</span>
        <a href="{$module_data.PRODUCTS_LINK}" class="productlink">Details</a>
    </dd>
</dl>
{/foreach}

Ich bekomme jetzt eine Warnung:
Invalid argument supplied for foreach() in

hier ist diese Zeile gemaint:
foreach ($array as $current)

und die print_r ausgabe sieht so aus:
Array
(
[0] =>
)die print_r Ausgabe ist mir noch einigermassen klar. Die Inhalte des "Smarty Arrays" bzw. der Variablen müssen mit $this->_tpl_vars['...xyz...']; angesprochen werden.

ich werde mal noch ein wenig rumprobieren vielleicht fällt dir ja auch noch etwas ein?!

Danke
Frank
 
ok, dann bitte mal so:

Code:
{php}
function remove_dup($matriz) {
   $aux_ini=array();
   $entrega=array();
   for($n=0;$n<count($matriz);$n++) {
     $aux_ini[]=serialize($matriz[$n]);
   }
   $mat=array_unique($aux_ini);
   for($n=0;$n<count($matriz);$n++) {
     $entrega[]=unserialize($mat[$n]);
   }
   foreach ($entrega as $key => $row){
     if (!is_array($row)) { unset($entrega[$key]); }
   }
   return $entrega;
}

$this->_tpl_vars['module_content'] = remove_dup($this->_tpl_vars['module_content']);
{/php}

{foreach name=aussen item=module_data from=$module_content}
<dl class="preview">
    <dd>
        {if $module_data.PRODUCTS_IMAGE!=''}
            <a href="{$module_data.PRODUCTS_LINK}">
                <img src="{$module_data.PRODUCTS_IMAGE}" alt="{$module_data.PRODUCTS_NAME}" />
            </a>
        {/if}
        <p class="shortdescreption">
            <strong>{$module_data.PRODUCTS_NAME}</strong><br />
            {$module_data.PRODUCTS_SHORT_DESCRIPTION|strip_tags|truncate:55:"...":true}<br />
            ab {$module_data.PRODUCTS_PRICE}<br />
        </p>
    </dd>
    <dd>
        <span>{$module_data.BUTTON_BUY_NOW}</span>
        <a href="{$module_data.PRODUCTS_LINK}" class="productlink">Details</a>
    </dd>
</dl>
{/foreach}
 
Innerhalb von {php} {/php} funktioniert es super Nur die foreach Anweisung will nicht so richtig. Dort sind immer noch alle doppelten drin.
 
Das heisst ein print_r auf $this->_tpl_vars['module_content'] zeigt das gekürzte Array und print_r auf $module_content zeigt das ungekürzte?

Wenn es so sein sollte, dann versuche mal:
Code:
$module_content=$this->_tpl_vars['module_content']

oder

Code:
$module_content = remove_dup($this->_tpl_vars['module_content']);

Marcus
 
ES funktioniert :),

es lag nur an den alten template Dateien. Jetzt funktioniert es SUPER

1000 Dank Marcus und auch noch mal danke an alle anderen die geholfen haben!!
 
Zuletzt bearbeitet:
Zurück