Самый эффективный способ заменить пустые значения в массиве - PullRequest
1 голос
/ 08 января 2011

Есть ли лучший способ сделать этот код PHP?Я перебираю массив и заменяю поле «title», если оно пустое.

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 ]

3 голосов
/ 08 января 2011
if ($result)
{
    foreach($result as &$result_row)
    {
        if(!$result_row['title'])
        {
            $result_row['title'] = 'untitled';
        }
    }
}

Кроме того, вы можете захотеть использовать что-то иное, чем логическое приведение, чтобы проверить существование заголовка в случае, если какой-нибудь молодой панк-режиссер выпустит фильм под названием 0.

Вы можете сделать что-нибудькак if (trim($result_row['title']) == '')

3 голосов
/ 08 января 2011
if($result) {
    foreach($result as $index=>$result_row) {
        if( !$result_row["title"] ) {
            $result[$index]["title"] = "untitled";
        }
    }
}

Тебе не нужно это считать. Это эффективно.

1 голос
/ 08 января 2011

Другой альтернативой может быть 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 в другом месте мысли

1 голос
/ 08 января 2011

Вмешиваясь немного в ответ @ Люка ...

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

Ключ - это ключ перед $ result_row в выражении foreach.Это делает его foreach ссылкой.Без этого значение $ result_row является копией, а не оригиналом.Ваш цикл завершится и выполнит всю обработку, но она не будет сохранена.

Единственный способ добиться большей эффективности - посмотреть, откуда поступают данные.Если вы извлекаете его из базы данных, можете ли вы сохранить каждую запись со значением «без названия» в качестве значения по умолчанию, чтобы вам не нужно было возвращаться и вводить значение позже?

0 голосов
/ 08 января 2011

Если вы хотите сладкий и короткий, попробуйте этот

$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

0 голосов
/ 08 января 2011

Возможно 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";}
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...