Çıkışı temizliği için PHP dizinin arama işlevleri

5 Cevap php

Ben bir veritabanından çıktı bir dizi var. Ben değerlere filtre temiz yolu nedir merak ediyorum

example array

Array
(
    [0] => Array
        (
            [title] => title 1
            [cat_title] => Drawings
            [sec_title] => Portfolio
        )

    [1] => Array
        (
            [title] => title 2
            [cat_title] => Paintings
            [sec_title] => Portfolio
        )

    [2] => Array
        (
            [title] => title 3
            [cat_title] => Drawings
            [sec_title] => Portfolio
        )
)

Örnek olarak ne htmlspecialchars için sec_title yılların büyük harfe cat_title tamamı ve tüm yapmak için temiz yolu olurdu?

I dizi haritası işlevini kullanabilirsiniz ki yanlış dizi kriteri olmadığını düşünüyordum. böyle

improper array

Array
(
    [title] => Array
        (
            [0] => title 1
            [1] => title 2
            [2] => title 3
        )

    [cat_title] => Array
        (
            [0] => Drawings
            [1] => Paintings
            [2] => Drawings
        )

)

Sonra kullanışlı gibi bir şey yapabilirsiniz:

array_map('strtoupper', $array['cat_title']);

ve tek seferde büyük harf cat_titles tüm olun. Bunun gibi bir şey emin what I have going on now olan bu döverdi.

$count = count($array);
for($i=0; $i < $count; $i++) { 
    //filter list output
    if (isset($array[$i]['cat_title'])) {
    	$array[$i]['cat_title'] = strtoupper($array[$i]['cat_title']);
    }
}

Siz ben numaralı dizisinde işlevleri callback olabilir zaten biliyor musunuz biraz daha zarif daha sonra yukarıda bulunuyor? Umarım yanlış diziyi sıralama olmadan? array_map veya array_walk gibi bir şey?

5 Cevap

Sen array_walk, bu gibi bir şey olurdu ile yapabilirsiniz:

function cleanData( &$item, $key )
{
  $item['cat_title'] = strtoupper( $item['cat_title'] );
  $item['sec_title'] = htmlspecialchars( $item['sec_title'] );
}

array_walk( $arr, 'cleanData' );

Ancak, aslında içerik tarayıcıya gönderirken htmlspecialchars gerçekten sadece son an için tasarlanmıştır gibi fonksiyonlar. O zaman önce, ham metin ile çalışmak ve sadece şablon / view dosyasında <?=htmlspecialchars($var)?> istiyorum. Eğer, örneğin, tekrar ve koşmak htmlspecialchars almak, sonra da bir veritabanına kodlanmış veri göndermek, aksi takdirde kodlama sorunları ile sona erebilir.


UPDATE: İşte bu test etmek için kullanılan kod; Benim için çalışıyor. PHP 5.2 değilim ama sürüm 4 + 'dan fonksiyonu herhangi bir fark yoktur.

$arr = array(
	array( 'title' => 'title 1', 'cat_title' => 'Drawings', 'sec_title' => 'Portfolio' ),
	array( 'title' => 'title 2', 'cat_title' => 'Paintings', 'sec_title' => 'Portfolio' ),
	array( 'title' => 'title 3', 'cat_title' => 'Drawings2', 'sec_title' => 'Portfolio' )
);


array_walk( $arr, 'cleanData' );
echo '<pre>', print_r($arr, true), '</pre>';

Çıkışlar:

Array
(
	[0] => Array
		(
			[title] => title 1
			[cat_title] => DRAWINGS
			[sec_title] => Portfolio
		)

	[1] => Array
		(
			[title] => title 2
			[cat_title] => PAINTINGS
			[sec_title] => Portfolio
		)

	[2] => Array
		(
			[title] => title 3
			[cat_title] => DRAWINGS2
			[sec_title] => Portfolio
		)

)

Nesneleri bir dizi yapmak: Bunun için Gerçekten Elegant yolu tüm ilişkilendirilebilir diziler kullanmak değildir. Bir kurucu ve başlık, cat_title ve alanlar gibi sec_title olan bir sınıf içine eleman çevirin. Sonra onları özel yapmak ve ayarlayıcıları kullanın (ya da bir kurucu kullanabilirsiniz) Eğer verileri kontrol ve size gereken herhangi bir doğrulama ya da dönüşümü gerçekleştirecek.

Benim çözüm array_map kullanarak ve anonymous functions edilir:

<?php
$data = array_map(
    function($element) {
        $element['cat_title'] = strtoupper($element['cat_title']);
        $element['sec_title'] = htmlentities($element['sec_title']);
        return $element;
    },
    $data);
?>

PHP

Ben sadece en azından size bir daha temel düzeyde üzerinde istediğiniz her şeyi erişim vereceğini, array_keys kullanabilirsiniz varsayalım:

foreach( $holder as $subarr )
{
    $keys = array_keys( $subarr );
    foreach( $keys as $key )
    {
        switch( $key ):
        {
            case 'cat_title':
                $subarr[ $key ] = strtoupper( $subarr[ $key ] );
                break;
            default:                    
                $subarr[ $key ] = htmlspecialchars( $subarr[ $key ] );
        }
    }
}

Kuşkusuz, bu çözüm size ihtiyacınız daha ayrıntılı bir iyi bir anlaşma olduğunu, ancak işe yarayacaktır.

Gereksiz işlev çağrıları için havai kaydetmek gibi biraz daha hızlı olduğu gibi yerine foreach-döngü önerebilirim.

<?php
foreach ($array as &$item) {
  $item['cat_title'] = strtoupper($item['cat_title']);
  $item['sec_title'] = htmlentities($item['sec_title']);
}
?>