Php все элементы массива равны

Проверка равенства двух массивов в PHP

Я хотел бы проверить, равны ли два массива. Я имею в виду: одинаковый размер, одинаковая индексация, одинаковые значения. Как я могу это сделать?

Используя «!==», я ожидаю, что следующее выражение выведет совпадени е и ли нет, если хотя бы один элемент в массиве(ах) отличается, но на самом деле это не так.

if (($_POST[‘atlOriginal’] !== $oldAtlPosition)

or ($_POST[‘atl’] !== $aext)

or ($_POST[‘sidesOriginal’] !== $oldSidePosition)

or ($_POST[‘sidesOriginal’] !== $sideext))

echo «совпадение»;

>

Ответ 1

Согласно вашему вопросу.

ПРИМЕЧАНИЕ: Принятый вопрос работает для ассоциативных массивов, но он не будет работать так, как ожидается, с индексированными массивами (объясняется ниже). Также эта функция может не работать с многомерными массивами (из-за структуры функции array_diff).

Например, тестирование двух индексированных массивов, элементы которых расположены в разном порядке, с помощью $a == $b или $a === $b не сработает:

(array(«x»,»y») == array(«y»,»x»)) === false;

?>

Это объясняется тем, что вышеуказанное означает:

array(0 => «x», 1 => «y») vs. array(0 => «y», 1 => «x») .

Чтобы решить эту проблему, используйте:

function array_equal($a, $b)

return (

is_array($a)

&& is_array($b)

&& count($a) == count($b)

&& array_diff($a, $b) === array_diff($b, $a)

);

>

?>

Ответ 2

Попробуйте выполнить сериализацию. Этот код также проверит вложенные подмассивы.

$foo =serialize($array_foo);

$bar =serialize($array_bar);

if ($foo == $bar) echo «Массив был проверен»;

Ответ 3

Простое решение, которое работает даже с массивами, ключи которых заданы в разном порядке:

public static function arrays_are_equal($array1, $array2)

array_multisort($array1);

array_multisort($array2);

return ( serialize($array1) === serialize($array2) );

>

Ответ 4

if (array_diff($a,$b) == array_diff($b,$a))

// проверка прошла

>

if (array_diff($a,$b) != array_diff($b,$a))

// проверка не прошла

>

С моей точки зрения, лучше использовать array_diff, чем array_intersect, потому что при проверках такого рода возвращаемые значения обычно имеют меньше различий, чем совпадений, и таким образом преобразование bool занимает меньше памяти. Обратите внимание, что это решение предназначено для простых массивов, и сравнения типа «==» и «===» могут быть применимы только для словарей.

Ответ 5

Другой метод проверки равенства независимо от порядка следования значений работает с помощью http://php.net/manual/en/function.array-intersect.php, например, так:

Читайте также:  Github artificial intelligence with python

$array1 = array(2,5,3);

$array2 = array(5,2,3);

if($array1 === array_intersect($array1, $array2) && $array2 === array_intersect($array2, $array1))

echo ‘равенство’;

> else

echo ‘ не равен ство ‘;

>

Вот версия, которая работает также с многомерными массивами:

$array1 = array(

array(5, 2),

array(3, 6),

array(2, 9, 4)

);

$array2 = array(

array(3, 6),

array(2, 9, 4),

array(5, 2)

);

if($array1 === array_uintersect($array1, $array2, ‘compare’) && $array2 === array_uintersect($array2, $array1, ‘compare’))

echo ‘равенство’;

> else

echo ‘ не равенство’;

>

function compare($v1, $v2)

if ($v1===$v2)

return 0;

>

if ($v1 > $v2) return 1;

return -1;

>

Ответ 6

Этот способ позволяет использовать ассоциативные массивы, члены которых упорядочены по-разному : например, они будут считаться равными во всех языках, кроме php 🙂

// рекурсивный ksort

function rksort($a)

if (!is_array($a))

return $a;

>

foreach (array_keys($a) as $key)

$a[$key] = ksort($a[$key]);

>

// SORT_STRING кажется необходимым, так как в противном случае

// числовые индексы (например, «0») не сортируются.

ksort($a, SORT_STRING);

return $a;

>

function considered_equal($a1, $a2)

return json_encode(rksort($a1)) === json_encode(rksort($a2));

>

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Источник

Проверьте, одинаковы ли все значения в массиве

Мне нужно проверить, равны ли все значения в массиве одинаковыми.

$allValues = array( 'true', 'true', 'true', ); 

Если каждое значение в массиве равно ‘true’ то я хочу эхо ‘all true’ . Если какое-либо значение в массиве равно ‘false’ то я хочу, чтобы эхо ‘some false’

Любая идея о том, как я могу это сделать?

все значения равны тестовому значению

if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true')

или просто проверить наличие вещи, которую вы не хотите.

if (in_array('false', $allvalues, true))

Предпочитайте последний метод, если вы уверены, что в массиве всего 2 возможных значения, так как он намного эффективнее. Но если есть сомнения, медленная программа лучше, чем некорректная программа, поэтому используйте первый метод.

Если вы не можете использовать второй метод, ваш массив очень велик, и содержимое массива, вероятно, будет иметь более 1 значения (особенно если значение, вероятно, произойдет вблизи начала массива), это может быть гораздо быстрее сделать следующее:

function isHomogenous($arr) < $firstValue = current($arr); foreach ($arr as $val) < if ($firstValue !== $val) < return false; >> return true; > 

Если ваш массив содержит фактические логические значения (или int) вместо строк, вы можете использовать array_sum :

$allvalues = array(TRUE, TRUE, TRUE); if(array_sum($allvalues) == count($allvalues)) < echo 'all true'; >else

Это работает, потому что TRUE будет оцениваться как 1 , а FALSE – 0 .

Читайте также:  Aim lkz css crfxfnm

Кроме того, вы можете конденсировать ответ козла в случае, если он не является двоичным:

if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true') < // . > 
if (array_unique($allvalues) === array('foobar')) < // all values in array are "foobar" > 

Почему бы просто не сравнить счет после вызова array_unique() ?

Чтобы проверить, одинаковы ли все элементы в массиве, должно быть просто:

$allValuesAreTheSame = (count(array_unique($allvalues)) === 1); 

Это должно работать независимо от типа значений в массиве.

Вы можете сравнить min и max … не самый быстрый способ; p

$homogenous = ( min($array) === max($array) ); 
$alltrue = 1; foreach($array as $item) < if($item!='true') < $alltrue = 0; >> if($alltrue) < echo("all true."); >else

Технически это не проверяет «какое-то ложное», оно проверяет «не все верно». Но похоже, что вы уверены, что единственные ценности, которые вы получите, – это «истина» и «ложь».

same(array(true, true, true)); // => true 
$x = 0; foreach ($allvalues as $a) < if ($a != $checkvalue) < $x = 1; >> //then check against $x if ($x != 0) < //not all values are the same > 

Источник

Проверьте, все ли значения в массиве одинаковы

Мне нужно проверить, все ли значения в массиве равны.

$allValues = array( 'true', 'true', 'true', ); 

Если каждое значение в массиве равно ‘true’ тогда я хочу повторить ‘all true’ , Если любое значение в массиве равно ‘false’ тогда я хочу повторить ‘some false’

Есть идеи о том, как я могу это сделать?

Решение

все значения равны тестовому значению

if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true')

или просто проверить на наличие того, что вы не хотите.

if (in_array('false', $allvalues, true))

Предпочитайте последний метод, если вы уверены, что в массиве может быть только 2 возможных значения, так как он намного эффективнее. Но если вы сомневаетесь, медленная программа лучше, чем неправильная, так что используйте первый метод.

Если вы не можете использовать второй метод, ваш массив очень большой, и содержимое массива скорее всего иметь более 1 значения (особенно если это значение может произойти ближе к началу массива), это может быть много быстрее сделать следующее:

function isHomogenous($arr) < $firstValue = current($arr); foreach ($arr as $val) < if ($firstValue !== $val) < return false; >> return true; > 

* примечание — некоторые ответы интерпретируют исходный вопрос как 1) how to check if all values are the same в то время как другие интерпретировали это как 2) how to check if all values are the same AND make sure that value equals the test value , Решение, которое вы выбираете, должно учитывать эту деталь. Мои первые 2 решения ответили # 1. мой isHomogenous() функция отвечает # 2, хотя вы можете изменить его, чтобы ответить # 1, передав значение $firstValue в качестве тестового значения, вместо использования первого значения, найденного в массиве, как я сделал.

Читайте также:  HTML Frames

Другие решения

Если в вашем массиве вместо строк содержатся действительные логические значения (или целые числа), вы можете использовать array_sum :

$allvalues = array(TRUE, TRUE, TRUE); if(array_sum($allvalues) == count($allvalues)) < echo 'all true'; >else

Это работает, потому что TRUE будет оцениваться как 1 , а также FALSE как 0 ,

Кроме того, вы можете сжать ответ козла, если он не двоичный:

if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true') < // . >
if (array_unique($allvalues) === array('foobar')) < // all values in array are "foobar">

Почему бы просто не сравнить счет после звонка array_unique() ?

Чтобы проверить, все ли элементы в массиве одинаковы, должно быть так же просто, как:

$allValuesAreTheSame = (count(array_unique($allvalues)) === 1); 

Это должно работать независимо от типа значений в массиве.

Вы можете сравнить мин и макс … не самый быстрый способ; р

$homogenous = ( min($array) === max($array) ); 
$alltrue = 1; foreach($array as $item) < if($item!='true') < $alltrue = 0; >> if($alltrue) < echo("all true."); >else

Технически это не проверяет «некоторые ложные», это проверяет «не все верно». Но, похоже, вы уверены, что единственные значения, которые вы получите, это «true» и «false».

same(array(true, true, true)); // => true 
$x = 0; foreach ($allvalues as $a) < if ($a != $checkvalue) < $x = 1; >> //then check against $x if ($x != 0) < //not all values are the same >

Источник

Оцените статью