Имея массив как [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')));
Хорошо, если вы используете 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'));
Других решений пока нет …