2009-11-09 4 views
1

데이터베이스의 출력 배열이 있습니다. 나는 값을 필터링 할 수있는 가장 깨끗한 방법은 무엇인지 궁금출력 정리를위한 PHP 배열 콜백 함수

가장 깨끗한 방법은 대문자로 cat_title의 모든을하는 것입니다 무엇을 예를 들어

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 
     ) 
) 

과 sec_title 년대의 모든 예를 배열 htmlspecialchars?

배열 배열 함수를 사용할 수 있다고 배열을 부적절하게 정렬하면 생각했습니다. 이

부적절한 배열

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

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

) 

처럼 그리고 내가 좋아하는 편리한 뭔가 할 수있는 :

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

을하고 한 번에를 대문자 cat_titles을 모두 확인합니다. 그걸 좋아할 것 같아요, 지금 제가 무엇을하고있는 것입니까.

$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']); 
    } 
} 

어쨌든 번호가 지정된 배열에 콜백 함수를 사용할 수 있다는 것을 알고 계십니까? 배열을 잘못 정렬하지 않고 바라기를 바랍니다. array_map 또는 array_walk와 같은 것?

+0

왜 데이터베이스 수준에서 결과를 필터링하지 않습니까? – knittl

+0

질문은 결과 배열에 콜백 함수를 사용하는 것에 관한 것입니다. 나는 데이터베이스 수준에서 markdown을 실행할 수 없습니다. – user73119

답변

1

, 그것은 무언가 같이 될 것입니다. 그 전에는 원시 텍스트로 작업하고 템플릿 /보기 파일에 <?=htmlspecialchars($var)?>을 넣기를 원합니다. 그렇지 않으면 예를 들어 인코딩 된 데이터를 데이터베이스로 전송 한 다음 검색하여 htmlspecialchars을 다시 실행하면 인코딩 문제가 발생할 수 있습니다.


UPDATE : 여기이를 테스트하는 데 사용되는 코드입니다; 그것은 나를 위해 잘 작동합니다. 나는 PHP 5.2에 있지만 버전 4 이상의 기능에는 차이가 없다.

$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>'; 

출력 : 틀림

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 ]); 
     } 
    } 
} 

:

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 
     ) 

) 
+0

배열이 숫자로 정렬되므로 작동하지 않습니다. 그래서 "나는 현재 무엇을하고 있는지"에 대한 진술을 받아야합니다. array_walk = PHP 경고 : 매개 변수 개수가 잘못됨 – user73119

+0

이것은 템플릿 이전 단계입니다. 나는 smarty, markdown, 날짜 함수 등과 같이 템플릿으로 보내질 때만 적용될 수있는 많은 다른 유틸리티 함수를 가지고있다. 양식에 대한 출력은 다른 기능을 가지며 데이터베이스에 대한 입력은 다른 기능을가집니다. 나는 tempaltes의 모든 함수를 필터링하지 않고 재사용 및 출력 할 수있는 클래스에 잘 보관하고 싶습니다. – user73119

+0

그것은 나를 위해 작동 ... – DisgruntledGoat

2

정말 우아한 방법은 연관 배열을 사용하지 않는 것입니다. 객체 배열을 만드십시오. 요소를 생성자 및 제목, cat_title 및 sec_title이 필드 인 클래스로 바꿉니다. 그런 다음 데이터를 비공개로 설정하고 데이터를 확인하고 필요한 유효성 검사 또는 변형을 수행 할 설정자 (또는 생성자 사용)를 사용합니다.

+0

이것은 개체에서 나오고 템플릿으로 들어가는 배열입니다. 이 값은 이미 데이터에 특정한 객체에서 수정됩니다. 나는 그럴 필요가 없다 : if (isset ($ array [$ i] [ 'cat_title']) { $ array [$ i] [ 'cat_title'] = strtoupper ($ array [$ i] [ 'cat_title'])); } 배열의 모든 필드에 적용됩니다. 특정 디자인 패턴이있는 경우 링크 또는 이름을 제공 할 수 있습니까? – user73119

+0

자신 만의 클래스를 정의하면 생성자에서 모든 것을 빈 문자열로 설정할 수 있으므로'isset'을 사용할 필요가 없습니다. – DisgruntledGoat

+0

예제에 대한 링크를 제공 할 수 있습니까? pdo를 사용하고 있다면 PDO :: FETCH_OBJ를 사용할 수 있습니까? 이게 네가 말하는거야? 현재 PDO :: FETCH_ASSOC을 사용하고 있습니다. 따라서 배열로 끝납니다. – user73119

0

내 솔루션 array_mapanonymous functions을 사용하고 있습니다 : 이러한 익명 함수는 5.3 기능입니다으로

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

당신이 PHP < 5.3을 사용하는 경우 당신이 다른 곳에서 기능을 넣어야 할 것입니다.

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

array_walk($arr, 'cleanData'); 

는하지만, htmlspecialchars 같은 기능이 정말로 단지 당신이 실제로 브라우저에 내용을 보내는 매우 마지막 순간위한 것입니다 : 당신은 array_walk하여이 작업을 수행 할 수

0

나는 적어도 당신이 기본적인 수준에 원하는 모든에 액세스 할 것이라는 점을, 당신은 단순히 array_keys를 사용할 수도있을 것 같군요 이 솔루션은 당신이 필요로하는 것보다 더 자세하게 좋은 것이지만 작동 할 것입니다.

+0

글쎄, 조금 덜 장황한 그런 다음 반복적 인 사업과 사업을합니다. 제안 해 주셔서 감사합니다. – user73119

0

불필요한 함수 호출에 대한 오버 헤드를 줄이면 약간 더 빠르기 때문에 foreach 루프를 대신 사용하는 것이 좋습니다.

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