Ich mache eine Codeüberprüfung mit einem Kollegen und wir möchten wissen, wie ein Array mit zwei Elementen, die beide dieselbe Zeichenfolge enthalten, am effizientesten erstellt werden kann.

Wenn wir ein Array und einen String wie folgt deklarieren:

$args = [];
$param = "a string";

Und wir wollen das Ergebnis:

print_r($args); //Array([0] => "a string" [1] => "a string")

Der ursprüngliche Code, den wir hatten, war:

array_push($args, $param);
array_push($args, $param);

Wir haben erkannt, dass dies besser sein kann:

array_push($args, $param, $param);

Aber gibt es einen schnelleren oder eleganteren Weg?

Auch: Ist das eine völlig triviale Frage? Ich habe versucht, die Operation mit microtime() zeitlich festzulegen, und ich kann keine Messung durchführen - aber vielleicht mache ich etwas falsch!


Der weitere Kontext des Problems besteht darin, dass $args ein Array von Parametern ist, die an eine SQL-Abfrage übergeben werden. Wir arbeiten in WordPress und eine vereinfachte Version der Abfrage lautet:

$query = "
    SELECT DISTINCT term_taxonomy_id AS 'instrument_category_id_to_show'
    FROM wp_term_relationships
    WHERE object_id IN(
        SELECT posts.ID
        FROM wp_posts posts
        JOIN wp_term_relationships term_relationships
        ON posts.ID = term_relationships.object_id
        WHERE (posts.post_content like %s OR posts.post_title like %s)
    )

    AND term_taxonomy_id IN (1,2,3)
";

$sql = $wpdb->prepare($query,$args);
1
Andrew Chart 29 Juni 2018 im 18:39

3 Antworten

Beste Antwort

Sie können dies mit array_fill tun:

$args = array_fill(0, 2, $param);

Ich weiß nicht, ob dies nach Ihren Maßstäben besser ist als Ihre array_push Version.

Ist das eine völlig triviale Frage?

Ja. Völlig trivial. Wenn der Unterschied zwischen zwei Optionen mehr als ein Tausendstel Ihrer Netzwerklatenz beträgt, wäre ich erstaunt.

3
lonesomeday 29 Juni 2018 im 15:45

Das kannst du machen:

$args[]= $param;
$args[]= $param; //two times

//------------ or ------------------

$args = [0=>$param, 1=>$param];

//------------ or -----------------

$args = [$param, $param];

Wie Sie sagten, gibt es bei array_push oder anderen Funktionen ... aber ehrlich gesagt ... keinen Unterschied zwischen diesen Methoden. Das Ergebnis ist in mehr oder weniger derselben Ausführungszeit dasselbe.

3
AymDev 29 Juni 2018 im 15:51

Möglicherweise müssen Sie Daten nicht mehrmals einfügen. Wenn Sie PDO verwenden, können Sie Ihre Abfrage mit der Semikolonsyntax vorbereiten (benannte Parameter):

$query = $pdo->prepare(
    'SELECT field
    FROM table
    WHERE
        field_a = :user_input
        AND field_b = :user_input
        AND field_c LIKE :input_b'
);

Senden Sie dann ein assoziatives Array an die execute() Methode, ohne dass dies erforderlich ist Dupliziere die Argumente:

$query->execute([
    'user_input' => $param,
    'input_b'    => '%' . $param . '%'
]);
2
AymDev 29 Juni 2018 im 15:54