【问题标题】:Validate PHP Array Key>Value验证 PHP 数组键>值
【发布时间】:2014-11-11 20:46:55
【问题描述】:

有一个类似 [1] 的数组

$arr = array(
        array(
            "ignoreMe" => "123",
            "checkMe" => "value",
        ),
        array(
            "ignoreMe" => "456",
            "checkMe" => "value",
        ),
 );

我想检查内部数组的特殊键(这里是键checkMe)是否具有相同的值。 如果所有键都具有相同的值,那么我想从内部数组中删除键。 (来自所有数组)

但是当有一个像 [2] 这样的数组时

$arr = array(
        array(
            "ignoreMe" => "123",
            "checkMe" => "value",
        ),
        array(
            "ignoreMe" => "456",
            "checkMe" => "value",
        ),
        array(
            "ignoreMe" => "789",
            "checkMe" => "foo", 
        ),
 );

所有键都应保持原样。

我将如何使用这个复杂的验证器来做到这一点? (链接https://github.com/Respect/Validation

[1] 的预期结果是

$arr = array(
        array(
            "ignoreMe" => "123",
        ),
        array(
            "ignoreMe" => "456",
        ),
 );

[2] 不应该被触摸

这是已经尝试过的:

$validator = v::arr()->each(v::key("check", v::equals('value')));

【问题讨论】:

  • @Rikesh 我已将预期结果添加到我的问题中。
  • 你试过什么?我不了解其他人,但我不是来教人们如何使用第三方库的。你应该自学,或者参加一些课程。
  • @SverriM.Olsen $validator = v::arr()->each(v::key("check", v::equals('value'))); 将为该键获取指定值。问题是,键的值并不总是相同的。这就是我卡住的地方。
  • 我想我会反过来不使用这个库来解决这个特定问题。我知道我解决这个问题的方法很好,但在我看来它产生的代码不太好。如果我确实找到解决此问题的方法,我会回来报告。
  • 你使用的是什么版本的 PHP?

标签: php arrays respect-validation


【解决方案1】:

好的,如果您运行的是 PHP 5.5+,那么您可以使用 array_columnarray_unique 函数的组合从数组中删除项目,如果它们都具有相同的值:

我不确定到底会调用什么这样的函数,所以我只是将其命名为myFunc...

function myFunc(array $arr, $key)
{
    // Get all the values using a key
    $values = array_column($arr, $key);

    // Remove all duplicates
    $unique = array_unique($values);

    // If there only is one item left then it means
    // that all the values are the same, so proceed
    // with modifying it...
    if (count($unique) === 1) {

        // Go over each array...
        foreach ($arr as $x => & $value) {

            // And unset the key
            unset($value[$key]);
        }
    }
    // Return the array
    return $arr;
}

例子:

$arr1 = array(
    array("ignoreMe" => "123", "checkMe" => "value"),
    array("ignoreMe" => "456", "checkMe" => "value"),
);
$arr2 = array(
    array("ignoreMe" => "123", "checkMe" => "value"),
    array("ignoreMe" => "456", "checkMe" => "value"),
    array("ignoreMe" => "789", "checkMe" => "foo"),
);

// All the values in this array are the same, so they
// will be removed
var_dump($arr1);
var_dump(myFunc($arr1, 'checkMe'));
echo '<hr>';

// There is a value in this array that is not the same
// as the others, so this array will be left intact
var_dump($arr2);
var_dump(myFunc($arr2, 'checkMe'));

【讨论】:

  • 工作得很好。我不知道array_column。不错的功能。 :)
  • @pquerner 是的,似乎没有多少人注意到它。它是在 5.5 中添加的,所以它相对较新,可能是为什么。
猜你喜欢
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 2010-12-29
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多