• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Vor jedes Array ein String

Sunnyboy

Mitglied
Hallo zusammen

Ich habe einen ganz langen Array. Vor jeden Teil davon möchte ich den immer gleichen String setzen.

Versucht habe ich es mit folgendem:
PHP:
$arr = array( $ausgansarray );
foreach ($arr as &$value) {
    $value = $string . $value;
}

Jedoch wird mir der String nur vor das erste Array gesetzt und nicht vor jedes.

Ich hoffe auf euer Wissen :)
Sunnyboy
 
Werbung:
Dein $value ist so wie du ihn benutzt readonly. Versuch es mal so:
PHP:
$arr = array( $ausgansarray );
foreach ($arr as $key => $value) {
    $arr[$key] = $string . $value;
}
Was soll das &-Zeichen vor $value?
 
Dein $value ist so wie du ihn benutzt readonly. Versuch es mal so:
PHP:
$arr = array( $ausgansarray );
foreach ($arr as $key => $value) {
    $arr[$key] = $string . $value;
}
Was soll das &-Zeichen vor $value?
Bitte informiere dich über Variablenreferenzen ;)

PHP:
$array = $ausgangsarray;
foreach ($array as &$value) {
    $value = $string . $value;
}

Du brauchst das Array nicht in ein anderes Array zu stopfen.

Aber ich bin mir sicher, dass das keine gute Idee ist, was du da vorhast. Erkläre doch mal bitte genau, was du damit vorhast ;)
 
Werbung:
Vielen Dank für eure Antworten
Ich glaube meine Formulierung war relativ verständlich, aber falls nicht...
Ich habe einen String, der jeweils durch Lücken geteilt ist. Ich mache einzelne Stücke daraus indem ich ihn mit explode zu Arrays mache. Vor jedes Array möchte ich nun den jeweils gleichen String setzen.
Beispiel:
String ist "bli bla blu"
Array ist also 0=>bli 1=>bla 2=>blu
Array geändert ist 0=>xxxbli 1=>xxxbla 2=>xxxblu

Das Plus ist nur so reingerutscht...
Ich versuche dann mal mit array_walk was ich aber noch nicht auf die Reihe kriege.

Vielen Dank schon mal
Sunnyboy
 
Ich habe es geschafft mit:

PHP:
$davor = "xxx";
$string = "bli bla blu";
array = explode(' ', $string);
 for ($n=0; $n<count($array); $n++) {
    $array[$n] = $davor . $array[$n];
  }

Vielen Dank für eure Hilfen!
Sunnyboy
 
Zuletzt bearbeitet:
Werbung:
Moin,
so z.B. mit array_walk()
PHP:
<?php 
$array = array('bli','bla','blu');

function myXXX(&$val)
  {     
  $val =  "xxx".$val;
  } 

array_walk($array, "myXXX");

MfG
 
@Sunnyboy
Bitte die Grundlagen lernen!
PHP:
$array[$n] = "xxx" . $array[$n];
 
Merci ich habe meinen alten Eintrag gleichzeitig geändert...
Das mit den Grundlagen weiss ich schon ;) aber ich lerne beim Machen, und komme so nicht an allem vorbei und vergesse während allem anderen auch ständig.

Vielen Dank
Sunnyboy
 
Werbung:
Moin,
so z.B. mit array_walk()
PHP:
<?php 
$array = array('bli','bla','blu');
function myXXX(&$val)
  {     
  $val =  "xxx".$val;
  } 

array_walk($array, "myXXX");

MfG

Der Overhead eines Funktionsaufrufs ist wirklich enorm.
@Sunnyboy: Was ist denn an meiner Lösung schlecht? Meine ist wohl, was Performance angeht, am besten.
 
Naja, enormer Overhead halte ich für übertrieben ;)
Hier eine optimierte Version:
PHP:
array_walk($array, create_function('&$val', '$val = "xxx" . $val;'));
Overhead halte ich auch für ein wenig übertrieben.
Aber wenn es schon um Geschwindigkeit geht, create_function ist extrem langsam ;)

Meine Version: 0,000044 sek
Asterixus's Version: 0,000036 sek
bdt600's Version: 0,0013 sek

Durchschnitt aus jeweils 20 aufrufen.
Also, create_function ist etwa 35 mal langsamer :)

Aber wayne? Vor allem bei einer privaten Homepage?

MfG
 
Werbung:
Ich gebe zu, dass ich das so nicht erwartet hätte. Ich war der Meinung, dass meine Version auf keinen Fall langsamer ist und PHP das optimiert.

Aber schon richtig, wir reden hier von tausendstel Sekunden, völlig wurscht.
 
Wer den Pfennig nicht ehrt, ist des Talers nicht wert. Das gilt hier auch.
Vor allem, wenn das Array groß ist oder das oft gemacht werden soll.

Und ja: etwas, das fünfunddreißigmal langsamer ist als etwas anderes kann man als Overhead bezeichnen und ist nie zu vernachlässigen.
 
PHP:
<?php // bench.php

define('PREFIX', str_repeat('x', 1e1));
define('ITERATIONS', 1e4);
$data = array_fill(0, 1e1, str_repeat('y', 1e1));

if ($argc === 1) {
    $funcs = array('array_walk', 'array_walk_cf', 'for', 'foreach', 'function_call');
    shuffle($funcs);

    foreach ($funcs as $func) {
        $output = array();
        exec('php -f ' . __FILE__ . ' ' . $func, $output);
        echo implode("\n", $output) . "\n";
    }
} elseif ($argv[1] === 'for') {
    $start = microtime(true);
    for ($i = 0; $i < ITERATIONS; $i++) {
        $tmp = $data;
        $c = count($tmp);
        for ($j = 0; $j < $c; $j++) {
            $tmp[$j] = PREFIX . $tmp[$j];
        }
    }
    echo 'for: ' . (microtime(true) - $start) . ' - ' . md5(implode('', $tmp)) . "\n";
} elseif ($argv[1] === 'array_walk') {
    $start = microtime(true);
    $f = function (&$t) { $t = PREFIX . $t; };
    for ($i = 0; $i < ITERATIONS; $i++) {
        $tmp = $data;
        array_walk($tmp, $f);
    }
    echo 'array_walk: ' . (microtime(true) - $start) . ' - ' . md5(implode('', $tmp)) . "\n";
} elseif ($argv[1] === 'array_walk_cf') {
    $start = microtime(true);
    $f = create_function('&$t', '$t = PREFIX . $t;');
    for ($i = 0; $i < ITERATIONS; $i++) {
        $tmp = $data;
        array_walk($tmp, $f);
    }
    echo 'array_walk_cf: ' . (microtime(true) - $start) . ' - ' . md5(implode('', $tmp)) . "\n";
} elseif ($argv[1] === 'foreach') {
    $start = microtime(true);
    for ($i = 0; $i < ITERATIONS; $i++) {
        $tmp = $data;
        foreach ($tmp as &$t) {
            $t = PREFIX . $t;
        }
        unset($t);
    }
    echo 'foreach: ' . (microtime(true) - $start) . ' - ' . md5(implode('', $tmp)) . "\n";
} elseif ($argv[1] === 'function_call') {
    function f(&$t)
    {
        $t = PREFIX . $t;
    }
    $start = microtime(true);
    for ($i = 0; $i < ITERATIONS; $i++) {
        $tmp = $data;
        $c = count($tmp);
        for ($j = 0; $j < $c; $j++) {
            f($tmp[$j]);
        }
    }
    echo 'function_call: ' . (microtime(true) - $start) . ' - ' . md5(implode('', $tmp)) . "\n";
}

Ich wollte ein paar Resultate posten für diverse Szenarien (siehe erste drei Zeilen), aber das Forum hat sich entschlossen, Kommazahlen in code-Blöcken schwachsinnig zu runden.

Aufruf jedenfalls:

Code:
$ php -f bench.php

Ergebnis auf meinem Rechner grob (> = etwas besser, >>> = viel besser):

(foreach > for) >>> (array_walk_cf > function_call) >>> array_walk

Wobei array_walk etwa bei 10-20 % von foreach steht, also etwa Faktor 5-10 langsamer ist – je nach Wahl der Variablen. Je mehr Rechenzeit für Stringoperationen benötigt wird, desto geringer die Unterschiede.

Code:
$ php --version
PHP 5.4.6-1ubuntu1 (cli) (built: Aug 22 2012 21:13:52) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans

ymmv
 
Werbung:
Zurück
Oben