2011-01-07 89 views
1

有沒有更好的方式來做這個PHP代碼?我正在做的是循環訪問數組並替換「標題」字段,如果它是空白的。最有效的方法來替換數組中的空值

if($result) 
{ 
    $count = 0; 

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

     $count++; 
    } 
} 

$結果是數據的數組是這樣的:

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

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


) 

我不是一個有經驗的PHP開發人員,但我想,我已經上文建議的方法是不最高效?

感謝

+0

我說這可能是足夠快,除非你有一個bazillion行(在這種情況下,您可能會遇到其他一些問題)。 – 2011-01-07 21:13:20

回答

1

在更@盧克的回答有點混合...

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

的關鍵是foreach語句的&前$ result_row。這通過引用使其成爲一個foreach。沒有這個,$ result_row的值是一個副本,而不是原來的。你的循環將完成並完成所有處理,但不會保留。

獲得更高效率的唯一方法是查看數據來自何處。如果您正在從數據庫中檢索數據,您是否可以將每個記錄以「未命名」的值作爲默認值進行保存,以便您不需要返回並在稍後輸入數值?

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))`但這不計算.. – 2011-01-07 22:19:01

+0

是的,is_array會更好。那只是他原來的複製和粘貼,我沒有想到要改變那部分。 – profitphp 2011-01-07 22:23:02

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

此外,您可能希望使用其他的東西比一個布爾投來檢查標題存在的情況下,一些年輕的朋克導演版本一部電影叫0

你可以做類似if (trim($result_row['title']) == '')

+0

+1爲正確的參考方法。雖然`trim ==''`對'0`沒有幫助。對於PHP''0'==''`。你需要`===`。 – NikiC 2011-01-07 23:01:36

+0

@nikic:`'0'==''`返回`false`而'0 ==''`返回`true`。 `$ result_row ['title']`將是一個字符串,所以這將工作正常。 – webbiedave 2011-01-07 23:22:43

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";} 
} 
?> 
1

另一種替代方法可以是json_encode + str_replace()然後json_decode()

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

作爲一行程序:

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

輸出:

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

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

我不知道這是否更有效率(我懷疑它,但你可以基準它),但至少它是一種不同的方式做同樣的事情,應該工作正常 - 你必須關心多維數組,如果你在其他地方使用title索引的話。

0

如果你想要甜美短,試試這個

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

empty()將做的工作,看到該文檔http://www.php.net/manual/en/function.empty.php

相關問題