2011-01-07 5 views
1

이 PHP 코드를 수행하는 더 좋은 방법이 있습니까? 내가하고있는 일은 배열을 반복하면서 "제목"필드를 비워 두는 것입니다.배열의 빈 값을 대체하는 가장 효율적인 방법

Array 
(
     [0] => Array 
       (
         [title] => sdsdsdsd 
         [body] => ssdsd 
       ) 

     [1] => Array 
       (
         [title] => sdssdsfds 
         [body] => sdsdsd 
       ) 


) 

내가 경험 PHP 개발자 아니지만, 내가 위에서 제시 한 방법은 아니라고 생각 : $가 결과

if($result) 
{ 
    $count = 0; 

    foreach($result as $result_row) 
    { 
     if(!$result_row["title"]) 
     { 
      $result[$count]["title"] = "untitled"; 
     } 

     $count++; 
    } 
} 

이 같은 데이터 배열입니다 가장 효율적인?

감사

+0

난 당신이 bazillion 행을하지 않는 한이 충분히 빠른 아마도 말하고 싶지만 (이 경우에는 다른 문제가있을 수 있습니다). –

답변

1

뭔가를 할 수 있습니다. 이것은 참조로 foreach합니다. 이것이 없으면 $ result_row의 값은 원본이 아니라 복사본입니다. 루프가 끝나고 모든 처리를 수행하지만 보관되지는 않습니다.

더 효율적인 방법은 데이터의 출처를 확인하는 것입니다. 데이터베이스에서이 레코드를 검색하는 경우 잠재적으로 "제목없는"값을 기본값으로 사용하여 각 레코드를 저장할 수 있으므로 나중에 되돌아 가서 값을 넣을 필요가 없습니다.

+0

'|| ='은 여전히 ​​유효하지 않습니다. ;) 그리고 값을 참조로 지정해도 실제로는 더 효율적이지 않습니다. – netcoder

+1

http://ideone.com/ZrXJL PHP에는 || = 연산자가 없습니다. – profitphp

+0

Luke의 의견을 보았 기 때문에 || 연산자를 교체했습니다. 내가 PHP 같은 동물을 찾을 수없는 이유를 설명합니다. –

3
if($result) { 
    foreach($result as $index=>$result_row) { 
     if(!$result_row["title"]) { 
      $result[$index]["title"] = "untitled"; 
     } 
    } 
} 

당신은 그것을 계산 할 필요가 없습니다. 그것은 효율적입니다.

+0

거기에'if ($ result)'가 무엇입니까? '$ result'가 문자열이라면? 'if (is_array ($ result))'를 이해할 수는 있지만 계산할 수는 없습니다 .. –

+0

예, is_array가 더 좋을 것입니다. 그건 원래의 사본과 붙여 넣기 일 뿐이었고 그 부분을 바꿀 생각은 없었습니다. 정확한 참조 접근을 위해 – profitphp

3
if ($result) 
{ 
    foreach($result as &$result_row) 
    { 
     if(!$result_row['title']) 
     { 
      $result_row['title'] = 'untitled'; 
     } 
    } 
} 

또한, 경우에 영화가 0라는 일부 젊은 펑크 이사 출시 제목의 존재를 확인하는 부울 캐스트가 아닌 다른 뭔가를 사용할 수 있습니다.

당신은

if($result) { 
    foreach($result as &$result_row) { // <--- Add & here 
    if($result_row['title'] == '') { 
     $result_row['title'] = 'untitled'; 
    } 
    } 
} 

의 핵심은 foreach 문에서 & 전에 $의 result_row입니다 ... @ 루크의 대답에 조금 더에 혼합 if (trim($result_row['title']) == '')

+0

+1. 'trim == ''는'0'에 도움이되지 않지만. PHP의 경우 ''0 '==' ''. '==='이 필요합니다. – NikiC

+0

@nikic :' '0'== '''는'false'를 반환하고 '0 ==' ''는'true를 반환합니다. '$ result_row [ 'title']'는 문자열 일 것이므로 잘 될 것입니다. – webbiedave

+0

와우, PHP 타입의 저글링이 마침내 나를 미치게 만들었던 것처럼 보입니다 ... 항상 그렇게 될 것이라고 생각했습니다. – NikiC

0

아마도 array_walk_recursive :

<?php 
$myArr = array (array("title" => "sdsdsdsd", "body" => "ssdsd"), 
       array("title" => "", "body" => "sdsdsd") ); 
array_walk_recursive($myArr, "convertTitle"); 
var_dump($myArr); 

function convertTitle(&$item, $key) { 
    if ($key=='title' && empty($item)) {$item = "untitled";} 
} 
?> 
+0

흥미롭지 만 오버 헤드로 인해이 방법은 단순한 foreach보다 여러 번 느려집니다. – webbiedave

+0

이것은 아마도 또 다른 질문이 될 수 있지만 어떤 오버 헤드가 있습니까? 또는 콜백 함수를 언급하고 있습니까? – DTest

1

다른 대안 json_encode + str_replace()하고 json_decode() 같을 수

$data = json_decode(str_replace('"title":""', '"title":"untitled"', json_encode($data)), true); 

출력 :

한 라이너

$data = array 
(
    0 => array 
    (
     'title' => '', 
     'body' => 'empty', 
    ), 

    1 => array 
    (
     'title' => 'set', 
     'body' => 'not-empty', 
    ), 
); 

$data = json_encode($data); // [{"title":"","body":"empty"},{"title":"set","body":"not-empty"}] 
$data = json_decode(str_replace('"title":""', '"title":"untitled"', $data), true); 

Array 
(
    [0] => Array 
     (
      [title] => untitled 
      [body] => empty 
     ) 

    [1] => Array 
     (
      [title] => set 
      [body] => not-empty 
     ) 
) 

이것이 더 효율적인지는 모르겠지만 (벤치마킹 할 수는 있지만) 적어도 동일한 방식의 다른 방법이므로 잘 작동해야합니다. 멀티를 신경 써야합니다. title 색인을 다른 곳에서 생각하면 차원 배열.

0

당신은 달콤한 짧은하려면 empty()이 일을 할 것 하나

$result = array(
    array(
     'title' => 'foo', 
     'body' => 'bar' 
    ), 
    array(
     'body' => 'baz' 
    ), 
    array(
     'body' => 'qux' 
    ), 
); 

foreach($result as &$entry) if (empty($entry['title'])) { 
    $entry['title'] = 'no val'; 
} 

var_dump($records); 

이의 문서를 참조하십시오 http://www.php.net/manual/en/function.empty.php

관련 문제