【问题标题】:Ignore element where a value name does not exist in PHP multidimensional array忽略 PHP 多维数组中不存在值名称的元素
【发布时间】:2020-09-24 11:13:29
【问题描述】:

对不起,如果在下面使用了错误的术语,希望您能理解我的意思。另外,请注意这只是一个学习任务,并没有实际使用。

我有一些 JSON 数据已被导入并解码到一个数组中。该数组是具有多个值(id、名称、价格、库存、类别、折扣等)的网上商店的不同产品的大约 20 个元素。我想根据名称打印所有项目的列表。但是,其中一个元素没有名称。 "name":"" 在 JSON 数据中完全缺失,因此在我的数组中也是如此。所以,它不是 NULL,它只是不存在。

我尝试了各种 if 函数(isset、!empty)并将 usort 和 foreach 放入 if 循环中,但我相信我尝试过的那些要求某个值名称确实存在但未设置而不是它根本不存在。

打印列表的代码示例:

echo "<table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Price</th>
        </tr>
    </thead>
    <tbody>";
                        
            usort($product_data, fn($a,$b) => strcmp($a->name, $b->name) );
            foreach($product_data as $product) { 
            echo "<tr>";
            echo "<td>". $product->name ."</td>";
            echo "<td>". $product->price ."</td>";
            }
        }
            echo"</td>
            </tr>
    </tbody>
    </table>";

无论我做什么,我都会收到此错误: 注意:未定义的属性:stdClass::$name in [filename]

我认为必须有一种快速的方式来说“如果'name'存在就这样做(否则什么都不做)”但根本找不到它。请帮忙!

【问题讨论】:

  • 首先,在没有“echo””的情况下执行你的代码。$product->name .””;”线。我认为您会遇到相同的错误,但使用 $price,因为问题是您没有正确调用这些字段。或者试试 $product.name。
  • 那么,这个echo isset($product-&gt;name)? $product-&gt;name : ''; 不起作用?
  • 不确定如何正确调用字段。我没有得到与价格相同的错误,所以相当肯定它与不存在的名称有关。 $product.name 不起作用,“致命错误:未捕获的错误:stdClass 类的对象无法转换为 C:\xampp\htdocs\index.php:140 中的字符串:堆栈跟踪:#0 {main} 在 C 中抛出: \xampp\htdocs\index.php”。但是可能与我的 JSON 工作有关。 $json_data = file_get_contents('./testapi.txt');$response = json_decode($json_data);$product_data = $response-&gt;products;
  • Err, isset 应该用在这里还是其他地方? echo "&lt;td&gt;".isset($product-&gt;name)? $product-&gt;name : ''."&lt;/td&gt;";如果在这里,不起作用。

标签: php multidimensional-array


【解决方案1】:

$product-&gt;name ?? '';

就像isset($product-&gt;name) ? $product-&gt;name : '';

【讨论】:

    【解决方案2】:

    解决办法可能是

    <pre>if(property_exists($product, 'name')){
     //put here your td
     echo "<td>". $product->name ."</td>";
    
    }</pre>
    

    使用 property_exists(object,attribtue betwen quotes) 来检查您获取的每个属性是否存在

    【讨论】:

    • 谢谢,如果我把它放在 foreach 循环中似乎可以正常工作。但是,我相信我的 usort 也有同样的问题(输出中的错误相同,但是 4 次也可能是其他错误)。这仍然是相同的,因为它发生在循环之前。任何提示如何我也可以排除 usort 中的属性?由于 $product 对象是在循环中声明的,我相信在它之前不能使用同一段代码,对吗?
    • 这是另一个问题,你需要重建你的对象,所以将你的旧对象分配给一个带有 foreach 的新对象,如果你发现一个缺失的属性,把它留空在新的对象中
    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    相关资源
    最近更新 更多