Php 键未定义,但有键

Php key is undefined, but there is key

我正在从另一个数组创建自己的数组,使用电子邮件字段作为键值。如果同一封电子邮件有更多结果,我会 array_push 到现有密钥。

我总是在数组中获取数据(通过电子邮件),这是示例

输入数据

示例数据

$saved_data = [
    0 => ['custom_product_email' => 'test@test.com',...],
    1 => ['custom_product_email' => 'test@test.com',...],
    2 => ['custom_product_email' => 'bla@test.com',...],
    3 => ['custom_product_email' => 'bla@test.com',...],
    ...
];

代码

$data = [];
foreach ($saved_data as $products) {
  $curVal = $data[$products->custom_product_email];
  if (!isset($curVal)) {
    $data[$products->custom_product_email] = [];
  }
  array_push($data[$products->custom_product_email], $products);
}

错误

我收到错误 Undefined index: test@test.com,如果我调试我的数组,存在值为 'test@test.com' 的键,所以键已定义 (!)

所以 var $curVal 键是 undefined

结果

所以 foreach 的目标是过滤数组中具有相同电子邮件的所有对象,示例如下:

$data = [
  'test@test.com' => [
    0 => {data},
    1 => {data},
    ...
  ],
  'bla@test.com' => [
    0 => {data},
    1 => {data},
    ...
  ],

];

检查 $data[$products->custom_product_email] 是否已经设置在 $data 数组中

试试这个代码

$data = [];

foreach ($saved_data as $products) {
  $curVal = isset($data[$products->custom_product_email]) ? $data[$products->custom_product_email] : null;
  if (!isset($curVal)) {
    $data[$products->custom_product_email] = [];
  }
  array_push($data[$products->custom_product_email], $products);
}

你没看到错误信息吗?

Parse error: syntax error, unexpected '{' in ..... from this code

$saved_data = [
    0 => {'custom_product_email' => 'test@test.com',...},
    1 => {'custom_product_email' => 'test@test.com',...},
    2 => {'custom_product_email' => 'bla@test.com',...},
    3 => {'custom_product_email' => 'bla@test.com',...},
    ...
];

{} 更改为 [] 以正确生成数组。

$saved_data = [
    0 => ['custom_product_email' => 'test@test.com',...],
    1 => ['custom_product_email' => 'test@test.com',...],
    2 => ['custom_product_email' => 'bla@test.com',...],
    3 => ['custom_product_email' => 'bla@test.com',...],
    ...
];

您的下一期在此代码中

$data = [];
foreach ($saved_data as $products) {
  $curVal = $data[$products->custom_product_email];
//          ^^^^^

$data 是您在上面两行初始化的空数组,因此它不包含任何键或数据!

这一行 $curVal = $data[$products->custom_product_email]; 没有用,并且是引发错误的行:您刚刚将 $data 初始化为一个空数组,逻辑上索引未定义。

你应该直接测试if (!isset($data[$products->custom_product_email])) {

然后解释:检索未定义的数组索引的值与isset中的相同代码之间存在根本区别。后者评估变量的存在,你可以放入不存在的东西(比如未定义的数组索引访问)。但是你不能在测试前将它存储在变量中。