php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #16 (permalink)  
Alt 26-03-2008, 00:26
janein
 Member
Links : Onlinestatus : janein ist offline
Registriert seit: May 2003
Beiträge: 206
janein ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Griecherus
Sind die Indizies der Arrays denn numerisch? Falls ja, dann ist array_intersect nämlich durchaus das, was du suchst. Du musst nur zusätzlich überprüfen, ob die Indizes der Übereinstimmungen (im Rückgabewert enthalten) gleich 0 sind.
Ja, sie sind nummerisch. Aber array_intersect überprüft doch nur ob ein array komplett gleich einem anderen ist. Ich will aber wissen ob die Position 1 gleich Position 1 einem anderen array ist, was dabei auf den anderen Positionen steht kann unterschiedlich sein.
Mit Zitat antworten
  #17 (permalink)  
Alt 26-03-2008, 00:34
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ja, habe ich eingesehen. Eine Möglichkeit, die mir spontan eingefallen ist, ist diese:
PHP-Code:
function array_first_key_is_equal()
{
    
$arrays      func_get_args();
    
$array_count count($arrays);

    
$result = array();

    for (
$i 0$i $array_count$i++)
    {
        if (
$arrays[0][0] == $arrays[$i][0])
        {
            
$result[] = $arrays[$i];
        }
    }

    return 
$result;

Du solltest dir aber bewusst sein, dass das nur eine Hilfe ist. Eine fertige Lösung für dein Problem ist das noch nicht, da der Vergleich der Arrays ausschließlich dem ersten gegenüber geschieht.

Geändert von Griecherus (26-03-2008 um 00:44 Uhr)
Mit Zitat antworten
  #18 (permalink)  
Alt 26-03-2008, 01:01
janein
 Member
Links : Onlinestatus : janein ist offline
Registriert seit: May 2003
Beiträge: 206
janein ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Griecherus
Ja, habe ich eingesehen. Eine Möglichkeit, die mir spontan eingefallen ist, ist diese:
PHP-Code:
function array_first_key_is_equal()
{
    
$arrays      func_get_args();
    
$array_count count($arrays);

    
$result = array();

    for (
$i 0$i $array_count$i++)
    {
        if (
$arrays[0][0] == $arrays[$i][0])
        {
            
$result[] = $arrays[$i];
        }
    }

    return 
$result;

Du solltest dir aber bewusst sein, dass das nur eine Hilfe ist. Eine fertige Lösung für dein Problem ist das noch nicht, da der Vergleich der Arrays ausschließlich dem ersten gegenüber geschieht.
Spontan eingefallen ... :-) NIcht schlecht. Leider klappt es nicht wie es sollte:
PHP-Code:
$result1 = array('a','b','c')
$result2 = array('a','y','w');
$result array_merge($result1$result2);

function 
array_first_key_is_equal()
{
    
$arrays      func_get_args();
    
$array_count count($arrays);

    
$result = array();

    for (
$i 0$i $array_count$i++)
    {
        if (
$arrays[0][0] == $arrays[$i][0])
        {
            
$result[] = $arrays[$i];
        }
    }

    return 
$result;
}
array_first_key_is_equal($result);
echo 
'<pre>';
print_r($result);
echo
'</pre>'
Ergebniss:
Array
(
[0] => a
[1] => b
[2] => c
[3] => a
[4] => y
[5] => w
)
Es sollte ja nur einmal "a" auftauchen.

Geändert von janein (26-03-2008 um 01:03 Uhr)
Mit Zitat antworten
  #19 (permalink)  
Alt 26-03-2008, 01:11
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Du benutzt die Funktion auch falsch. Die Arrays müssen einzeln an die Funktion übergeben werden.
PHP-Code:
$result array_first_key_is_equal($array1$array2, ..., $arrayn); 
Dann ist das Ergebnis auch fast wie gewollt. Das einzige Problem allerdings ist, dass der Vergleich zwischen den Schlüsseln immer im Bezug zum ersten Array steht. Und die Funktion dahingehend zu erweitern ist deine Aufgabe

Ich verabschiede mich für heute: Gute Nacht, Forum!

Geändert von Griecherus (26-03-2008 um 01:13 Uhr)
Mit Zitat antworten
  #20 (permalink)  
Alt 26-03-2008, 08:41
janein
 Member
Links : Onlinestatus : janein ist offline
Registriert seit: May 2003
Beiträge: 206
janein ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von janein
Spontan eingefallen ... :-) NIcht schlecht. Leider klappt es nicht wie es sollte:
PHP-Code:
$result1 = array('a','b','c')
$result2 = array('a','y','w');
$result array_merge($result1$result2);

function 
array_first_key_is_equal()
{
    
$arrays      func_get_args();
    
$array_count count($arrays);

    
$result = array();

    for (
$i 0$i $array_count$i++)
    {
        if (
$arrays[0][0] == $arrays[$i][0])
        {
            
$result[] = $arrays[$i];
        }
    }

    return 
$result;
}
array_first_key_is_equal($result);
echo 
'<pre>';
print_r($result);
echo
'</pre>'
Ergebniss:
Array
(
[0] => a
[1] => b
[2] => c
[3] => a
[4] => y
[5] => w
)
Es sollte ja nur einmal "a" auftauchen.
Es soll ja jedes argument mit jedem verglichen werden. Ich habe es so probiert aber es klappt nicht:
[PHP]
...
for ($e = 0; $e < $array_count; $e++)
for ($i = 0; $i < $array_count; $i++)
{
if ($arrays[$e][0] == $arrays[$i][0])
{
$result[] = $arrays[$i];
}
}
}

return $result;
}
[⁄PHP]
Mit Zitat antworten
  #21 (permalink)  
Alt 26-03-2008, 08:43
janein
 Member
Links : Onlinestatus : janein ist offline
Registriert seit: May 2003
Beiträge: 206
janein ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von janein
Es soll ja jedes argument mit jedem verglichen werden. Ich habe es so probiert aber es klappt nicht:
[PHP]
...
for ($e = 0; $e < $array_count; $e++) {
for ($i = 0; $i < $array_count; $i++)
{
if ($arrays[$e][0] == $arrays[$i][0])
{
$result[] = $arrays[$i];
}
}
}

return $result;
}
[⁄PHP]
Mit Zitat antworten
  #22 (permalink)  
Alt 26-03-2008, 12:15
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zwei verschachtelte Schleifen sind schonmal nicht schlecht, auf diese Weise allerdings doch sinnfrei.

Hier mal der Pseudocode einer möglichen Herangehensweise:
Code:
für jedes i von 0 bis array_länge

    für jedes j von i + 1 bis array_länge

        falls array[i][0] === array[j][0]

            zwischenergebnis in result_array ablegen

        ende_falls

    ende_für

ende_für
Das ist so noch recht simpel. Implementierst du das eins-zu-eins, dann solltest du einige Elemente doppelt im Ergebnis haben, also musst du dir da noch etwas einfallen lassen.

Grüße
Mit Zitat antworten
  #23 (permalink)  
Alt 26-03-2008, 21:37
janein
 Member
Links : Onlinestatus : janein ist offline
Registriert seit: May 2003
Beiträge: 206
janein ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Mit folgendem code habe ich probiert über eine Vergleichs array die Werte zu überprüfen, aber es klappt nicht. Ich bekomme es einfach nicht hin, die doppelten Werte aus einem mehrdimensionalen array zu löschen. Evt. hat ja jemand noch einen anderen Ansatz ... ich komme leider nicht weiter.

[code]
foreach (explode("\n", $lines1) as $line1)
{
$result1[] = explode('|', $line1);

}

foreach (explode("\n", $lines2) as $line2)
{
$result2[] = explode('|', $line2);
}

for ($i = 0, $laenge = count($result1); $i < $laenge;$i++ ){
$a[] = array( $result1[$i][0]);
if($a[$i][0]=="" ){
unset($a[$i]);
}
}

for ($i = 0, $laenge = count($result2); $i < $laenge;$i++ ){
$b[] = array( $result2[$i][0]);
}
[⁄code]
Mit Zitat antworten
  #24 (permalink)  
Alt 26-03-2008, 22:44
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich habe dir doch einen Ansatz in Pseudocode vorgeschlagen. Den musst du nur noch ausarbeiten, das Hauptsächliche macht er bereits.
Mit Zitat antworten
  #25 (permalink)  
Alt 26-03-2008, 23:07
janein
 Member
Links : Onlinestatus : janein ist offline
Registriert seit: May 2003
Beiträge: 206
janein ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Griecherus
Ich habe dir doch einen Ansatz in Pseudocode vorgeschlagen. Den musst du nur noch ausarbeiten, das Hauptsächliche macht er bereits.
So?
[PHP]
for ($i = 0, $laenge = count($result1); $i < $laenge;$i++ ){
for ($e = 0, $laenge = count($result2); $e < $laenge;$i++ ){
if($result[$result1[$i]] === $result2[$e]){
unset($result[$i]);
}
}
}
[⁄PHP]
Ich schnalls nicht ... und sehe keinen Zusammenhang mehr.
(Und wieso kommt mein code immer so unformatiert rüber?)

Geändert von janein (26-03-2008 um 23:10 Uhr)
Mit Zitat antworten
  #26 (permalink)  
Alt 26-03-2008, 23:22
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Nein, so nicht. Gehen wir das Ganze nochmal grundlegender an: Du möchtest, dass eine variable Anzahl von Arrays miteinander verglichen werden. Für diesen Vergleich ist für jedes Array jeweils nur der erste Schlüssel von Relevanz. Denn ins Ergebnis kommen nur die Arrays, die einen identischen ersten Schlüssel haben. Soweit klar?
Jetzt musst du also einen Algorithmus schreiben, der genau das macht. Und da gibt es sicherlich nicht nur eine einzige Möglichkeit. Ich erkläre dir meinen Ansatz mal an einem Beispiel:
Code:
array1 = array(123, abc, def);
array2 = array(321, ghi, jkl);
array3 = array(123, mno, pqr);
array4 = ...
array5 = ...
array6 = ...

// ins Ergebnis gehören array1 und array2, da der erste Schlüssel `123`identisch ist
Jetzt schnappst du dir das erste Array (array1) und vergleichst den ersten Schlüssel (array1[0]) mit dem ersten Schlüssel des darauf folgenden array (array2[0]). Findest du eine Übereinstimmung -> speichern. Danach kommt das nächste Array (array3[0]) usw.
Es entsteht also folgendes Durchlaufmuster (bei bspw. 6 Arrays):

array1[0] mit array2[0]
array1[0] mit array3[0]
array1[0] mit array4[0]
array1[0] mit array5[0]
array1[0] mit array6[0]

array2[0] mit array3[0]
array2[0] mit array4[0]
array2[0] mit array5[0]
array2[0] mit array6[0]

array3[0] mit array4[0]
array3[0] mit array5[0]
array3[0] mit array6[0]

array4[0] mit array5[0]
array4[0] mit array6[0]

array5[0] mit array6[0]

fertig. Muster verstanden?
Das ist jetzt noch sehr "roh". Das heisst es ist noch viel, viel Platz für Optimierungen. Aber das soll jetzt erstmal reichen.
Mit Zitat antworten
  #27 (permalink)  
Alt 27-03-2008, 00:05
janein
 Member
Links : Onlinestatus : janein ist offline
Registriert seit: May 2003
Beiträge: 206
janein ist zur Zeit noch ein unbeschriebenes Blatt
Standard

So, mit diesem code erhalte ich ein Ergebnis. Allerdings werden 3 Treffer gefunden. Das verstehe ich nicht und wie kann ich die doppelten Werte löschen? Wenn ich unset($a[$i]) auf den gefundenen Wert ansetze kommen diese nervigen "Notice: Undefined offset:" Fehler ...

Zitat:
$a[0] = array("a", "b", "c");
$b[0] = array("a", "a", "z");

$treffer = "";
$h =1;
// Werte vergleichen
for($i=0;$i<count($a);$i++){
for($j=0;$j<count($b[$i]);$j++){
if($a[$i][0] == $b[$i][0]){

// Treffer
$treffer[$h] = $array01[$i][0];

$h++;
}
}
}

Geändert von janein (27-03-2008 um 00:09 Uhr)
Mit Zitat antworten
  #28 (permalink)  
Alt 27-03-2008, 00:14
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Das sieht doch schonmal nicht schlecht aus. Nur am zweiten count störe ich mich noch.
Dass du doppelte Einträge erhalten würdest, habe ich dir ja gesagt. Jetzt haben wir schon eine ganze Menge zusammen durchgekaut, überleg mal selbst. Schnapp dir von mir aus Stift und Papier. Wie könnteste du vermeiden, dass doppelte Einträge entstehen (und zwar ohne, dass du das Ergebnis-Array nochmal durchläufst und die doppelten Einträge löschst, sondern innerhalb fder beiden Schleifen, die für die Vergleiche zuständig sind)? Zwei Tipps gebe ich dir noch mit:[list=1][*]Hast du erstmal eine Übereinstimmung mehrerer Schlüssel gefunden, musst du sie bei der nächsten Iteration eigentlich nicht mehr miteinbeziehen. Das erspart außerdem Ressourcen, macht den Algorithmus also etwas effektiver.[*]unset() - wie du schon an den undefined offset Fehlern bemerkt hast - löscht das Array-Element und seinen Key gleich dazu. Also fehlt der gelöschte Key im nächsten Durchlauf. Du suchst also eine Funktion, die das Array nachdem sie es beschnitten hat, neu indiziert. Und die gibt es.[/list=1]
Also zurücklehnen, nachdenken, versuchen und schaffen. Sonst nehme ich noch Lehrgebühr
EDIT:

Übrigens, du musst deinen Code mit Leerzeichen einrücken, damit hier etwas aus der Formatierung wird (beim Posten also fleißig <wortschöpfung>leerzeichnen</wortschöpfung>)


Geändert von Griecherus (27-03-2008 um 00:20 Uhr)
Mit Zitat antworten
  #29 (permalink)  
Alt 27-03-2008, 00:32
janein
 Member
Links : Onlinestatus : janein ist offline
Registriert seit: May 2003
Beiträge: 206
janein ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Erstmal vielen herzlichen Dank für Deine Geduld und Deine Mühe!

Ich habe jetzt nach dieser php Funktion gesucht die einen Wert und Key löscht und das array neu indiziert - aber nicht gefunden. Wie heißt sie? :-) Und was stört Dich am count?
Mit Zitat antworten
  #30 (permalink)  
Alt 27-03-2008, 00:40
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von janein
Erstmal vielen herzlichen Dank für Deine Geduld und Deine Mühe!
Gern geschehen.
Zitat:
Original geschrieben von janein
Ich habe jetzt nach dieser php Funktion gesucht die einen Wert und Key löscht und das array neu indiziert - aber nicht gefunden. Wie heißt sie? :-) Und was stört Dich am count?
array_slice() heisst sie. In puncto count: Du möchtest die Schleife genau so oft durchlaufen, wie Arrays noch vor dir liegen. Denk nochmal drüber nach.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:09 Uhr.