可能未声明父变量时,如何显示一列数据?

How to display a column of data when the parent variable might not be declared?

我正在我的 codeigniter 项目的视图层中生成一些动态内容。

<td class="<?php echo empty($log->category) ? "noactioncell" :''; ?> text-center align-middle">
<?php echo !empty($log->category) ? foreach($log->category as $c):echo $c->category_name."<br/>"; endforeach; : '';?></td>

问题是,我的三元表达式出现以下错误:

Parse error: syntax error, unexpected token "foreach"

$log->category 未声明时,如何显示由 <br/> 标记分隔的循环 category_name 数据而不产生此错误?

您发布的代码编码错误。正确且更具可读性的变体将是这样的:

<td class="<?php echo empty($log->category) ? "noactioncell" :''; ?> text-center align-middle">
<?php 
    if(!empty($log->category)){
        foreach($log->category as $c){
            echo $c->category_name."<br/>"; 
        }
    }
?>
</td>

这里有一个很好的解释:

The ternary operator takes 3 expressions in the form of (expr1) ? (expr2) : (expr3).

continue(或您的情况下的 foreach)是控制结构语句,而不是表达式。和 因此,它不能是三元运算符的操作数。事实上,none PHP 的运算符接受控制结构作为操作数,就 我意识到。这同样适用于广泛的 C 系列的其他产品 语言也是如此。

为了可读性,最好使用 if 你的案例陈述。

作者:@Fabrício Matté How to use continue keyword in a ternary operator in php

您当然可以在一行代码中将您的柱状数据与 <br> 粘合在一起,但我不会使用三元表达式来做到这一点。

由于您的多维对象可能声明了 category 属性,因此您可以使用 empty() 作为第一个条件(三元表达式)。至于要作为<td>的文本进行拼接的数据,可以使用null coalescing operator回退到数组。 array_column() 如果您要求未声明的列,则不会抱怨。使用这种技术组合可以防止在循环中生成不必要的尾随 </br>。内爆平面阵列是这种情况下的 better/cleaner 方法(无论您喜欢哪种 syntax/style)。

代码:(Demo)

<td class="<?php echo empty($log->category) ? 'noactioncell ' : ''; ?>text-center align-middle">
    <?php echo implode('<br/>', array_column($log->category ?? [], 'category_name')); ?>
</td>

category 有 3 个 category_name 属性时的输出:

<td class="text-center align-middle">
    example1<br/>example2<br/>example3
</td>

未声明category时的输出:

<td class="noactioncell text-center align-middle">
</td>

读起来太难?好吧,把它分散到多行。

<td class="<?php echo empty($log->category) ? 'noactioncell ' : ''; ?>text-center align-middle">
    <?php echo implode(
                   '<br/>',
                   array_column(
                       $log->category ?? [],
                       'category_name'
                   )
                ); ?>
</td>