Проверить ключ массива PHP> Значение

0

Имея массив, подобный [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')));
Теги:
arrays
respect-validation

1 ответ

2
Лучший ответ

Хорошо, если вы используете PHP 5. 5+, то вы можете использовать комбинацию функций array_column и array_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'));
  • 0
    Работает просто замечательно. Я не знал о array_column . Хорошая функция. :)
  • 0
    @pquerner Да, не многие люди, кажется, заметили это. Он был добавлен в 5.5, поэтому он относительно новый, вероятно, почему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню