仅当变量设置时将其添加到数组中

5
我有一个数组,操作如下:
事实证明,有些变量并没有始终设置,这会导致在尝试将其插入到数据库中时出现未定义索引问题?
是否有一种快速的方法可以在将其添加到数组之前检查每个值是否已设置?
    $show_insert = array(
        'title' => $show_data['title'],
        'thetvdb_id' => $show_data['tvdbid'],
        'release_date' => $show_data['FirstAired'],
        'lastupdatethetvdb' => $show_data['lastupdatethetvdb'],
        'moviedb_id' => $show_data['moviedb_id'],
        'imdb_id' => $show_data['IMDB_ID'],
        'img_id' => $show_data['tvdbid'],
        'media_type' => 1,
        'status' => $show_data['status'],
        'length' => $show_data['runtime'],
        'network' => $show_data['network'],
        'overview' => $show_data['overview'],
        'seasons' => $show_data['seasons'],
        'episodes' => $show_data['episodes'],
        'homepage' => $show_data['homepage'],
        'last_airdate' => $show_data['last_air_date'],
        'vote_average' => $show_data['vote_average']
    );

4
不是重复的问题,因为我无法编写 'title' => if (array_key_exists('title', $show_data)) ? $show_data['title'] : '';,可以吗? - Callombert
2
是的,你可以,但你需要使用三元运算符。请看下面我的回答。 - Patrick Moore
3个回答

7
你可以使用三元运算符isset()。我们正在检查变量和键是否已设置(在?之前的部分)。如果设置了,使用该变量(在?:之间的部分),如果没有设置,则设置为空白(在:之后的部分)。
三元运算符的工作方式如下: $variable =(比较?如果为真:如果为假); 因此:
$show_insert = array(
    'title' => ( isset( $show_data['title'] ) ? $show_data['title'] : '' ),
    'thetvdb_id' => ( isset( $show_data['tvdbid'] ) ? $show_data['tvdbid'] : '' ),
    [etc.]
);

4
在 PHP 5.3+ 中,现在可以写成 $show_data['title'] ?: ''。更快,更简单。 - BMN
@YellowBird 感谢你 :) - Patrick Moore
不知道我可以这样使用它,谢谢。 - Callombert
1
我不明白这是如何回答问题的?由于该数组似乎是列=>值对,因此空列应该被删除,或者更好的方法是根本不将它们放入数组中吗?我想这取决于该列需要什么,只有提问者才知道,但对我而言,这将是首选,如果该列允许,则删除或从未添加。 - CodingInTheUK
2
在 PHP 7 中,您可以使用空值合并运算符,例如 $show_data['title'] ?? '' - Chris
显示剩余4条评论

2

扩展其他答案:

我会使用一个函数来简化所有的输入,同时,我会使用empty()而不是isset(),但如果你只是将其设置为空字符串,那么这部分就不太重要了。

function checkVal($val, $show_data){ 
    return empty($show_data[$val]) ? "" : $show_data[$val]; 
} 

$show_insert = array( 
    'title' => checkVal('title',$show_data), 
    'thetvdb_id' => checkVal('tvdbid',$show_data) 
);

如果变量不存在,empty()函数不会抛出警告。 - I wrestled a bear once.
1
啊,再次感谢你,@jeroen。 - I wrestled a bear once.

2
if (isset($show_data['title']) {
$show_insert[title] = $show_data['title'];
}

这基本上意味着如果$show_data[title]已初始化,则将其添加到$show_insert数组的“title”键下,如果没有设置,则不会发生任何事情,因此不会出现数组键“title”

或者对于大型数组,您可以使用:

public function check_set($array, $variable = null, $key_name)
    if ($variable != null) {
    $array[$key_name] = $variable;
    }


check_set($show_insert, $show_data[title], $title = '"title"');

1
从技术上讲,这是可行的,但对于大型数组,您将为每个数组元素重复条件。 - BMN
好的,检查编辑。 - Eujinks
因为如果您将数组发送到数据库或API,则此答案是唯一有效的,所以点赞。一个空但已存在的字段将清空数据库中的任何先前值,而完全缺少的字段通常会忽略任何更新,并且仅修改实际设置的值。 - DocWeird

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接