PHP: nasıl htmlspecialchar gerçekleştirmek için () bir dizi-of-diziler?

6 Cevap php

Nasıl dizi nesneleri bir dizi üzerinde PHP işlevi htmlspecialchars() çalıştırabilirim?

Ben aşağıdaki kodu vardır:

$result_set = Array
(
    [0] => Array
        (
            [home_id] => 1
            [address] => 4225 Nasmyth Dr
            [city] => Plano
            [state] => TX
            [zip] => 76798
        )

    [1] => Array
        (
            [home_id] => 8
            [address] => 4229 Nasmyth Dr
            [city] => Plano
            [state] => TX
            [zip] => 75093
        )
);

// this doesn't work since $result_set is an array of arrays and htmlspecialchars is expecting a string
htmlspecialchars($result_set, ENT_QUOTES, 'UTF-8')); 

UPDATE:

Aşağıda epeyce cevaplar var olsa bile, bunların hiçbiri bir dizi-of-diziler için çalışmak olduğunu unutmayınız. Aşağıdaki cevaplar sadece basit diziler için çalışır.

Ben aşağıdaki denedim ama çalışmıyor:

array_walk_recursive($result_set, "htmlspecialchars", array(ENT_QUOTES,'UTF-8'))

Ben şu hatayı alıyorum: htmlspecialchars() expects parameter 2 to be long, string given


UPDATE 2

Ben çalıştığınızda:

function cleanOutput(&$value) {
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
print_r($result_set);
print('-------');
print_r(array_walk_recursive($result_set, "cleanOutput"));

Aşağıdaki, istenmeyen, çıktı almak:

Array
(
    [0] => Array
        (
            [home_id] => 1
            [address] => 4225 Nasmyth Dr
            [city] => Plano
            [state] => TX
            [zip] => 76798
        )
    [1] => Array
        (
            [home_id] => 8
            [address] => 4229 Nasmyth Dr
            [city] => Plano
            [state] => TX
            [zip] => 75093
        )
)
-------1

UPDATE 3

Ben çalıştığınızda:

function cleanOutput(&$value) {
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
$result_set = Array
    (
        [0] => Array
            (
                [home_id] => 1
                [address] => 4225 Nasmyth Dr
                [city] => Plano
                [state] => TX
                [zip] => 76798
            )

        [1] => Array
            (
                [home_id] => 8
                [address] => 4229 Nasmyth Dr
                [city] => Plano
                [state] => TX
                [zip] => 75093
            )
    );

$cleanedOutput = array();
foreach ($result_set as $rs) {
    $cleaned[] = array_map("cleanOutput", $rs);
}
print_r($cleanedOutput);

Aşağıdaki, istenmeyen, sonuçlar alırsınız:

{'homes' : []}

6 Cevap

Jonathon Sampson gibi, başka bir alternatif array_walk olduğunu array_map kullanmak isteyebilirsiniz

Fark array_walk sağladığınız dizide doğrudan çalışır durumda iken array_map, her öğeye uygulanan fonksiyonu ile dizinin bir kopyasını döndürür olmasıdır.

Eğer geri çağrılan işleve birden fazla argüman geçiyoruz eğer kendi işlevi oluşturmak gerekmez.

Göre php.net,

array array_map ( callback $callback , array $arr1 [, array $... ] )

Yani bu birden fazla argüman geçmek istiyorsanız sadece geçmesi gerektiği anlamına gelir:

$clean_array = array_map("htmlspecialchars", $myArray, array(ENT_QUOTES, 'UTF-8'));

ama nedense bu benim için çalışmıyor.

Ama bu, neden bana sormayın yok gibi görünüyor.

$clean_array = array_map("htmlspecialchars", $myArray, array(ENT_QUOTES), array('UTF-8'));

Bu çok boyutlu diziler için çalışmasını sağlamak için yapılan yol:

function secure($val) {
    return (is_array($val))?array_map('secure',$val):htmlspecialchars($val, ENT_QUOTES, 'UTF-8');
}

Bu son kullanılan dizi olmadan dizide kendi-kendini çağırır ve onun değil bir dizi, bu işlevi htmlspecialchars geçirir eğer, çalışır.

Girdi: Array ( [0] => test< [1] => Array ( [test>] => <test?> ) [2] => Array ( [0] => test [1] => > [2] => Array ( [0] => bigtest<> ) ) )

Çıktı: Array ( [0] => test&lt; [1] => Array ( [test>] => &lt;test?&gt; ) [2] => Array ( [0] => test [1] => &gt; [2] => Array ( [0] => bigtest&lt;&gt; ) ) )

Eğer array_map kullanmak ve fonksiyon argümanlarını geçmek istiyorsanız, kendi işlevi oluşturmak ve geri arama gibi kullanabiliriz:

 function cleanhtml($dirtyhtml) {
       return htmlspecialchars($dirtyhtml, UTF-8);
  }

  $cleaned = array_map("cleanhtml", $myArray);