替换数组中空值的最有效方法

时间:2011-01-07 21:10:59

标签: php arrays foreach

有没有更好的方法来执行此PHP代码?我正在做的是循环遍历数组并替换“标题”字段,如果它是空白的。

if($result)
{
    $count = 0; 

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

        $count++;
    }
}

其中 $ result 是一个包含如下数据的数组:

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

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


)

我不是一位经验丰富的PHP开发人员,但我想我上面提出的方式不是最有效的吗?

由于

6 个答案:

答案 0 :(得分:3)

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

你不需要数数。这很有效率。

答案 1 :(得分:3)

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

此外,如果某位年轻朋克导演发布名为0的电影,您可能需要使用除布尔演员之外的其他内容来检查标题是否存在。

您可以执行if (trim($result_row['title']) == '')

之类的操作

答案 2 :(得分:1)

再多混合@ Luke的回答......

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

关键是&amp;在foreach语句中$ result_row之前。这使它成为一个参考的foreach。没有它,$ result_row的值是副本,而不是原始副本。你的循环将完成并完成所有处理,但不会保留。

提高效率的唯一方法是查看数据的来源。如果您是从数据库中检索它,是否可以使用“无标题”值保存每条记录作为默认值,这样您以后就不需要返回并输入值了?

答案 3 :(得分: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索引。

答案 4 :(得分: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";}
}
?>

答案 5 :(得分: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