我有两个数组,第一个看起来像这样(注意created
和approved
只有两个来自这个例子的六个元素);
Array
(
[created] => Array
(
[label] => Order created
[roles] => Array
(
[0] => ROLE_USER
)
[next_states] => Array
(
[approve] => Array
(
[target] => approved
)
)
)
[approved] => Array
(
[label] => Order approved
[roles] => Array
(
[0] => ROLE_USER
)
[next_states] => Array
(
[order] => Array
(
[target] => ordered
)
)
)
)
一旦完成一个步骤(如created
等),就会填充另一个数组; (让我们称这个数组为arrayFinished
)
Array
(
[created] => 1
)
如何比较这两个数组以获得三种不同的状态; completed
,active
和disabled
。就像是;如果步骤created
在arrayfinished
回显完成,则步骤created
是添加到arrayfinished
回声有效的最后一个,否则禁用。
这是我尝试的但是输出错误了;
foreach ($steps as $key => $value) {
if (array_key_exists($key, $arrayFinished)) {
echo $value['label'] . ' is complete<br>';
} elseif ($key === end($arrayFinished)) {
echo $value['label'] . ' is active<br>';
} else {
echo $value['label'] . ' is disabled<br>';
}
}
可以从上面foreach
输出:
Order created is complete
Order approved is disabled
Order ordered is disabled
Order delivered is disabled
Invoice verified correct is disabled
Invoice paid is disabled
第一个(已创建)应该处于活动状态,因为它是数组中的“最后一个”。
有人可以帮助我解决这个问题,因为我现在用一些听起来简单的事情来挣扎几个小时。树枝会更容易吗?因为我需要将div类设置为返回的值。
如果在PHP中完成,我该怎么把它送到Twig?
拜托,我绝望地需要帮助。
答案 0 :(得分:0)
end()
只会移到数组的最后一项,然后你需要使用key()
函数:
foreach ($steps as $key => $value) {
if (array_key_exists($key, $arrayFinished)) {
echo $value['label'] . ' is complete<br>';
} else {
end($arrayFinished);
if ($key === key($arrayFinished)) {
echo $value['label'] . ' is active<br>';
} else {
echo $value['label'] . ' is disabled<br>';
}
}
}
答案 1 :(得分:0)
正如我在评论中所说,
$keys = array_keys($arrayFinished);
$last = end($keys);
foreach ($steps as $key => $value) {
if (array_key_exists($key, $arrayFinished)) {
echo $value['label'] . ' is complete<br>';
} elseif ($key === $last) {
echo $value['label'] . ' is active<br>';
} else {
echo $value['label'] . ' is disabled<br>';
}
}
在循环之外获取该数组的最后一个键,而不是使用end()
而不是在循环期间不必要地重复这些内容。并且可以避免一些无用的错误。此外,通过使用array_keys
然后使用end
,您不会将原始数组中的指针移动到最后。也就是说,无论如何,这通常不会引起太多问题,但是.......
你也可以改变这个
....
if (array_key_exists($key, $arrayFinished)) {
....
要
....
if (isset($arrayFinished[$key])) {
....
我认为这也快一点。但是,它具有相同的效果。
更新:更改此
if (array_key_exists($key, $arrayFinished)) {
echo $value['label'] . ' is complete<br>';
} elseif ($key === $last) {
echo $value['label'] . ' is active<br>';
} else {
echo $value['label'] . ' is disabled<br>';
}
到
if ($key === $last) {
echo $value['label'] . ' is active<br>';
} elseif (array_key_exists($key, $arrayFinished)) {
echo $value['label'] . ' is complete<br>';
} else {
echo $value['label'] . ' is disabled<br>';
}
原因是永远不会评估第二个条件,因为如果它是真的那么第一个条件也是真的,基本上如果键是数组中的最后一个,那么它也被设置。所以,第二个永远不会被评估......
答案 2 :(得分:0)
foreach ($steps as $key => $value) {
if (array_key_exists($key, $arrayFinished)) {
if (count($arrayFinished) > 1) {
echo $value['label'] . ' is active<br>';
} else {
echo $value['label'] . ' is complete<br>';
}
} else {
echo $value['label'] . ' is disabled<br>';
}
}