我有一个小问题,似乎很难解决。修复可能很容易,但我太笨了,自己无法修复。也许你们可以对此有所了解。
问题
我需要用PHP创建一个多维数组。这很好用。然而,最后一个嵌套数组有时由2个元素组成,有时由3个元素组成。因此,这篇文章的标题是"不对称的"。
这个问题很可能是由基于我的PHP代码中的开关变量创建嵌套数组引起的。如果未定义变量(例如case 'inactive'
中的$button
),则键无论如何都会放在$elements
数组中,但没有值。
PHP代码
$player = Array();
$data = @$_POST['players'];
if (!empty($data) && is_array($data)) {
foreach($data as $id){
$player_info = mysqli_query($connection, "SELECT * FROM players WHERE id = '$id'");
$player_info = mysqli_fetch_assoc($player_info);
switch ($player_info['status']) {
case 'active':
$color = '#30B490';
$status = 'active';
$button = 'buttons';
break;
case 'inactive':
$color = '#A1A1A1';
$status = 'inactive';
break;
case 'standby':
$color = '#F0AD4E';
$status = 'standby';
$button = 'buttons';
break;
default:
$color = '#4FA1D9';
$status = 'unknown';
break;
}
// THIS PART SEEMS TO CAUSE MY ISSUE
$elements = array(
"indicator" => $color,
"status" => $status,
"button" => $button
);
// THIS PART SEEMS TO CAUSE MY ISSUE
foreach ($elements as $label => $element) {
$player[$id][$label] = $element;
}
}
}
print_r($player);
print_r()结果
当前
Array (
[1] => Array (
[indicator] => #A1A1A1
[status] => inactive
[button] =>
)
[2] => Array (
[indicator] => #30B490
[status] => active
[button] => yes
)
[3] => Array (
[indicator] => #4FA1D9
[status] => standby
[button] => yes
)
)
应该是什么
Array (
[1] => Array (
[indicator] => #A1A1A1
[status] => inactive
)
[2] => Array (
[indicator] => #30B490
[status] => active
[button] => yes
)
[3] => Array (
[indicator] => #4FA1D9
[status] => standby
[button] => yes
)
)
您可以看到这两个结果之间的差异。看看[button] =>
。当我json_encode()处理整个多维数组时,结果显示一个值null
,这似乎不正确。
{"1":{"indicator":"#A1A1A1","status":"inactive","button":null},"2":{"indicator":"#30B490","status":"active","button":"buttons"},"3":{"indicator":"#4FA1D9","status":"unknown","button":"buttons"}}
我想要什么
我希望多维数组是干净的(没有空值),就像print_r()
结果中显示的那样。
你知道我应该在PHP代码中编辑什么来创建一个合适的多维数组吗?
谨致问候,Peter de Leeuw
是的,这会导致问题
// THIS PART SEEMS TO CAUSE MY ISSUE
$elements = array(
"indicator" => $color,
"status" => $status,
"button" => $button
);
发生的情况是,你用一个空的var$按钮定义键按钮,下一次迭代$按钮也没有重置,你的脚本可能会导致一些意想不到的行为
为什么不这样分配$元素呢?
switch ($player_info['status']) {
case 'active':
$elements = array(
'color' => '#30B490',
'status' => 'active',
'button' => 'buttons');
break;
case 'inactive':
$elements = array(
'color' = '#A1A1A1',
'status' = 'inactive');
break;
case 'standby':
$elements = array(
'color' => '#F0AD4E',
'status' => 'standby',
'button' => 'buttons');
break;
default:
$elements = array(
'color' => '#4FA1D9';
'status' => 'unknown');
break;
}
甚至像这样:
$player[$id]['status'] = $player_info['status'];
switch ($player_info['status']) {
case 'active':
$player[$id]['color'] = '#30B490';
$player[$id]['button'] = 'buttons';
break;
case 'inactive':
$player[$id]['color'] = '#A1A1A1';
break;
case 'standby':
$player[$id]['color'] = '#F0AD4E';
$player[$id]['button'] = 'buttons';
break;
default:
$player[$id]['color'] = '#F0AD4E';
$player[$id]['status'] = 'unknown'; //overwrite status from database to unknown
break;
}
或更小的
//Outside the loop
$colors = array('active' =>'#30B490', 'inactive' => '#A1A1A1', 'standby' => '#F0AD4E');
//Inside the loop
$player[$id]['status'] = $player_info['status'];
$player[$id]['color'] = isset($colors[$player_info['status']) ? $colors[$player_info['status'] : '#4Fa1D9';
if($player[$id]['status'] == 'active' || $player[$id]['status'] == 'standby')
$player[$id]['buttons'] = 'buttons';
为什么不给$button分配一个"no"值呢?
switch ($player_info['status']) {
case 'active':
$element = array(
'color' => '#30B490',
'status' => 'active',
'button' => 'buttons');
break;
case 'inactive':
$element = array(
'color' = '#A1A1A1',
'status' = 'inactive');
'button' => 'no');
break;
case 'standby':
$element = array(
'color' => '#F0AD4E',
'status' => 'standby',
'button' => 'buttons');
break;
default:
$element = array(
'color' => '#4FA1D9';
'status' => 'unknown');
break;
}
这将有助于您稍后使用json.parse 处理答案
您可以简单地使用array_filter()
$player = array_map('array_filter', $player);
这将清除$player
中每个数组的空值