如何检查另一个数组中是否存在数组键

时间:2016-05-26 13:47:02

标签: php arrays symfony twig

我有两个数组,第一个看起来像这样(注意createdapproved只有两个来自这个例子的六个元素);

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
)

如何比较这两个数组以获得三种不同的状态; completedactivedisabled。就像是;如果步骤createdarrayfinished回显完成,则步骤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?

拜托,我绝望地需要帮助。

3 个答案:

答案 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>';
        }
    }