Как проверить, является ли массив PHP ассоциативным или последовательным?

В сообщении говорится все, но это всего лишь предупреждение не само по себе:

printf("Address of p1: %p\n", (void*)pt1);
729
задан 4 revs, 4 users 80% 2 August 2014 в 08:30
поделиться

13 ответов

Вы задали два вопроса, которые не совсем эквивалентны:

  • Во-первых, как определить, имеет ли массив только числовые ключи
  • , Во-вторых, как определить, имеет ли массив последовательный , числовые ключи, запускающиеся от 0

, Рассматривают, в каком из этих поведений Вы на самом деле нуждаетесь. (Может случиться так, что любой сделает в Ваших целях.)

первый вопрос (просто проверяющий, что все ключи являются числовыми) отвечен хорошо капитаном kurO .

Для второго вопроса (проверяющий, индексируется ли массив нулем и последователен), можно использовать следующую функцию:

function isAssoc(array $arr)
{
    if (array() === $arr) return false;
    return array_keys($arr) !== range(0, count($arr) - 1);
}

var_dump(isAssoc(array('a', 'b', 'c'))); // false
var_dump(isAssoc(array("0" => 'a', "1" => 'b', "2" => 'c'))); // false
var_dump(isAssoc(array("1" => 'a', "0" => 'b', "2" => 'c'))); // true
var_dump(isAssoc(array("a" => 'a', "b" => 'b', "c" => 'c'))); // true
568
ответ дан 10 revs, 7 users 34% 2 August 2014 в 08:30
поделиться
function isAssoc($arr)
{
    $a = array_keys($arr);
    for($i = 0, $t = count($a); $i < $t; $i++)
    {
        if($a[$i] != $i)
        {
            return false;
        }
    }
    return true;
}
-2
ответ дан albo 2 August 2014 в 08:30
поделиться

Конечно, это - лучшая альтернатива.

<?php
$arr = array(1,2,3,4);
$isIndexed = array_values($arr) === $arr;
127
ответ дан 2 revs, 2 users 92% 2 August 2014 в 08:30
поделиться

Один дешевый и грязный путь состоял бы в том, чтобы проверить как это:

isset($myArray[count($myArray) - 1])

... Вы могли бы получить ложь, положительную, если Ваш массив похож на это:

$myArray = array("1" => "apple", "b" => "banana");

А более полный путь мог бы состоять в том, чтобы проверить ключи:

function arrayIsAssociative($myArray) {
    foreach (array_keys($myArray) as $ind => $key) {
        if (!is_numeric($key) || (isset($myArray[$ind + 1]) && $myArray[$ind + 1] != $key + 1)) {
            return true;
        }
    }
    return false;
}
// this will only return true if all the keys are numeric AND sequential, which
// is what you get when you define an array like this:
// array("a", "b", "c", "d", "e");

или

function arrayIsAssociative($myArray) {
    $l = count($myArray);
    for ($i = 0; $i < $l, ++$i) {
        if (!isset($myArray[$i])) return true;
    }
    return false;
}
// this will return a false positive on an array like this:
$x = array(1 => "b", 0 => "a", 2 => "c", 4 => "e", 3 => "d");
-1
ответ дан nickf 2 August 2014 в 08:30
поделиться

Если PHP не будет иметь встроенное для этого, Вы не будете в состоянии сделать это в меньше, чем O (n) - перечисляющий по всем ключам и проверяющий на целый тип. На самом деле Вы также хотите удостовериться, что нет никаких дыр, таким образом, Ваш алгоритм мог бы быть похожим:

for i in 0 to len(your_array):
    if not defined(your-array[i]):
        # this is not an array array, it's an associative array :)

, Но почему беспокойство? Просто предположите, что массив имеет тип, который Вы ожидаете. Если это не будет, это просто аварийно завершится в Вашей поверхности - это - динамическое программирование для Вас! Протестируйте свой код, и все будут хорошо...

0
ответ дан Daren Thomas 2 August 2014 в 08:30
поделиться
function is_associative($arr) {
  return (array_merge($arr) !== $arr || count(array_filter($arr, 'is_string', ARRAY_FILTER_USE_KEY)) > 0);
}
0
ответ дан 3 revs 2 August 2014 в 08:30
поделиться

Если Ваш поиск просто нечисловых ключей (неважно, порядок) затем можно хотеть попробовать

function IsAssociative($array)
{
    return preg_match('/[a-z]/i', implode(array_keys($array)));
}
-5
ответ дан null 2 August 2014 в 19:30
поделиться

Еще один способ сделать это.

function array_isassociative($array)
{
    // Create new Array,  Make it the same size as the input array
    $compareArray = array_pad(array(), count($array), 0);

    // Compare the two array_keys
    return (count(array_diff_key($array, $compareArray))) ? true : false;

}
0
ответ дан 3 revs 2 August 2014 в 19:30
поделиться

Я просто использую ключ () функция. Наблюдайте:

<?php
var_dump(key(array('hello'=>'world', 'hello'=>'world'))); //string(5) "hello"
var_dump(key(array('world', 'world')));                  //int(0)
var_dump(key(array("0" => 'a', "1" => 'b', "2" => 'c'))); //int(0) who makes string sequetial keys anyway????
?>

Таким образом, только путем проверки на ложь, можно определить, ассоциативен ли массив или нет.

-3
ответ дан 2 revs 2 August 2014 в 19:30
поделиться

На самом деле самый эффективный путь таким образом:

function is_assoc($array){
   $keys = array_keys($array);
   return $keys !== array_keys($keys);
}

Это работает, потому что это сравнивает ключи (которые для последовательного массива всегда являются 0,1,2 и т.д.) к ключам ключей (который, будет всегда быть 0,1,2 и т.д.).

19
ответ дан 4 revs, 3 users 67%anon 2 August 2014 в 19:30
поделиться
function checkAssoc($array){
    return  ctype_digit( implode('', array_keys($array) ) );
}
20
ответ дан 22 November 2019 в 21:28
поделиться

Я сравниваю разницу между ключами массива и ключами результата array_values ​​() массива, который всегда будет массивом с целочисленными индексами. Если ключи совпадают, это не ассоциативный массив.

function isHash($array) {
    if (!is_array($array)) return false;
    $diff = array_diff_assoc($array, array_values($array));
    return (empty($diff)) ? false : true;
}
0
ответ дан 22 November 2019 в 21:28
поделиться

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

$y= array(5);
$y["0x"]="n";
$y["vbg"]="12132";
$y[1] = "k";

var_dump($y); //this will output 4 element array

echo "</br>" .$y["0x"]."</br>".$y[0];

for($x=0;$x<sizeof($y);$x++){ // this will output all index elements & gives error after that
    echo "</br> index elements ".$y[$x];
}

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

function AssocTest(&$arr){
    if(is_array($arr)){

        reset($arr); // reset pointer to first element of array

        if(gettype(key($arr)) == "string"){ //get the type(nature) of first element key 
            return true;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

можно использовать его в качестве нормальной функции

echo(AssocTest($y)?  "Associative array": "Not an Associative array/ Not an array at all");

и важная вещь помнить evan, который Вы имеете, инициализируют массив как ассоциативный, но имена, которые Вы имеете, дали ассоциативный массив, просто числа, которые это будет рассматривать как индексный массив, когда это считанный php, если Вы не имеете явно, дало названия строк. смотрите на пример ниже.

$y["0"]="n";
$y["1"]="12132";
$y["22"] = "k";

//both will get the same output
echo "<br/> s0 ".$y["22"];
echo "<br/> s0 ".$y[22];

for($x=0;$x<count($y);$x++){
   echo "<br/> arr ".$y[$x]; // this will output up to 2nd element and give an error after

}

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

function fullAssocTest(&$arr)
{
    if(is_array($arr)){
        return (array_keys($arr) !== range(0, count($arr) - 1));
    }
}

ее меньше кодирования, но эта вещь является действительно процессом интенсивная и действительно ненужная работа.

0
ответ дан 22 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: