[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: как определить ассоциативный массив или индексный
eurobax
В функцию передается параметр-массив $arr.
Мне необходимо определить - индексный он, или ассоциативный для задачи нестандартной сериализации массива.
Не могу сообразить - как это сделать, не перебирая ключи и не проверяя что они - числа?



Спустя 3 минуты, 54 секунды (17.04.2011 - 18:35) waldicom написал(а):
Цитата (eurobax @ 17.04.2011 - 16:31)
не перебирая ключи и не проверяя что они - числа?

видимо никак

Спустя 1 минута, 6 секунд (17.04.2011 - 18:36) Игорь_Vasinsky написал(а):
наверно проверить все ключи на integer, а может и готовая функция в php уже есть.

запустил в цикле - если хотябы один false - значит не индексный. (функцию написать)

Спустя 6 минут (17.04.2011 - 18:42) eurobax написал(а):
Цитата (Игорь_Vasinsky @ 17.04.2011 - 15:36)
наверно проверить все ключи на integer, а может и готовая функция в php уже есть.

запустил в цикле - если хотябы один false - значит не индексный. (функцию написать)

Именно так сейчас и делаю. Функции типа is_array_assoc нет sad.gif

Спустя 4 минуты, 50 секунд (17.04.2011 - 18:47) Игорь_Vasinsky написал(а):
Молодец. Потом можно исходник отправить разработчикам, название только подкорректировать: who_is_array();

а синтаксис прост:

bool who_is_array(array);
// если индексный то на выходе TRUE
// если нет то FALSE

И ты в доле.

Настроение просто хорошее, без обид :)

Спустя 2 минуты, 8 секунд (17.04.2011 - 18:49) waldicom написал(а):
Цитата (Игорь_Vasinsky @ 17.04.2011 - 16:36)
наверно проверить все ключи на integer, а может и готовая функция в php уже есть.

А это как? Можно пример?

Спустя 25 минут, 23 секунды (17.04.2011 - 19:14) Игорь_Vasinsky написал(а):
нет, пример нельзя.

Спустя 4 минуты, 43 секунды (17.04.2011 - 19:19) waldicom написал(а):
Цитата (Игорь_Vasinsky @ 17.04.2011 - 17:14)
нет, пример нельзя.

Че так?

Спустя 38 минут, 30 секунд (17.04.2011 - 19:58) Игорь_Vasinsky написал(а):
не на выставке.

Спустя 48 минут, 14 секунд (17.04.2011 - 20:46) inpost написал(а):
foreach ($arr as $k=>$v)
{
if(is_numeric($k))
continue
else

{
$omg = 1;
break;
}
}

if(!empty($omg))
echo '$arr is assoc';
else
echo '$arr is int';

Спустя 3 минуты, 54 секунды (17.04.2011 - 20:50) waldicom написал(а):
Цитата (inpost @ 17.04.2011 - 18:46)
foreach ($arr as $k=>$v)
{
    if(is_numeric($k))
        continue
    else

    {
        $omg = 1;
        break;
    }
}

if(!empty($omg))
    echo '$arr is assoc';
else
    echo '$arr is int';

Такое будет работать неверно (умалчивая уже об ужасном стиле, но это на функциональность не влияет)

Спустя 1 минута, 29 секунд (17.04.2011 - 20:51) denizkin написал(а):
inpost
Так чисто не в тему, название переменной $omg улыбнуло! smile.gif

Спустя 11 минут, 31 секунда (17.04.2011 - 21:03) Игорь_Vasinsky написал(а):
inpost
И улыбнулся на аватаре ! biggrin.gif Молодец!

Спустя 9 минут, 55 секунд (17.04.2011 - 21:13) neadekvat написал(а):
Цитата (waldicom @ 17.04.2011 - 21:50)
Такое будет работать неверно

Отчего же?

А если допилить, то как-то так:
$type = 'numeric';
foreach ($arr as $k => $v)
{
if ( ! is_numeric($k)) {
$type = 'associative';
break;
}
}


echo '$arr is '. $type .' array';


А еще можно немножко извратиться, хотя в результате это будет работать быстрее:
$tmp_arr = array_flip($arr);
$keys = implode('', $tmp_arr);

echo is_numeric($keys) ? 'numeric array' : 'assoc array';

Спустя 3 минуты, 48 секунд (17.04.2011 - 21:17) waldicom написал(а):
Цитата (neadekvat @ 17.04.2011 - 19:13)
Отчего же?

[занудство]
Начнем с того, что там не хватает запятой. Но фиг с ней, просто опечатка.
Но вот этот массив, он аcсоциативный или нет?
$arr['1e4'] = 'test';
А вот этот?
$arr['0xA'] = 'test';

Код от inpost (да и Ваш тоже) выводит, что это целочисленные массивы
[/занудство]

Спустя 5 минут, 23 секунды (17.04.2011 - 21:22) neadekvat написал(а):
waldicom, во-первых, честно - вы встречали такие имена индексов на практике? Я - нет и вряд ли встречу, что-то мне подсказывает.
Во-вторых, мой код второй массив определил как ассоциативный.

Спустя 1 минута, 56 секунд (17.04.2011 - 21:24) waldicom написал(а):
Цитата (neadekvat @ 17.04.2011 - 19:22)
Во-вторых, мой код второй массив определил как ассоциативный.

Насчет второго это точно, я там вместо нуля букву о поставил. Надо вот так "0xA"
А насчет "давайте честно": я лично не видел. А еще я не видел кенгуру в живую.
Индексы массива, они же не только от руки даюются, они могут приходить из БД, из файлов или других источников.
И если программировать в надежде на то, что какая-то ситуация не проявится, то она обязательно проявится smile.gif

Спустя 3 минуты, 2 секунды (17.04.2011 - 21:27) Игорь_Vasinsky написал(а):
чёт не получается вывести... различает, может потомц что:

is_numeric - определяет, является ли переменная числом или числовой строкой.


Спустя 2 минуты, 3 секунды (17.04.2011 - 21:29) Игорь_Vasinsky написал(а):
echo is_numeric('1a0sd');
:blink: тишина... работает чтоли...


Спустя 1 минута, 52 секунды (17.04.2011 - 21:31) neadekvat написал(а):
Цитата (waldicom @ 17.04.2011 - 22:24)
А насчет "давайте честно": я лично не видел. А еще я не видел кенгуру в живую.

Не вижу смысла отказываться от is_numeric в пользу усложнения кода ради теоретически возможного, но дебильного варианта.
По поводу того, что откуда-то еще лезет, кроме ручного ввода - то там (скорее всего), php воспримит это не как $arr['0xA'], а как $arr[0xA].

Цитата (waldicom @ 17.04.2011 - 22:24)
Надо вот так "0xA"

Я и думаю - вроде 0 и "о" далеко находятся, мб что-то другое хотели сказать..

Спустя 5 минут, 28 секунд (17.04.2011 - 21:36) waldicom написал(а):
Цитата (neadekvat @ 17.04.2011 - 19:31)
Не вижу смысла отказываться от is_numeric в пользу усложнения кода ради теоретически возможного, но дебильного варианта.

Мне жаль Ваших пользователей. Но тут не надо усложнять код, тут надо просто использовать другую функцию вместо is_numeric()
Цитата (neadekvat @ 17.04.2011 - 19:31)
По поводу того, что откуда-то еще лезет, кроме ручного ввода - то там (скорее всего), php воспримит это не как $arr['0xA'], а как $arr[0xA].

Это врядли, ибо цэ строка.
Цитата (neadekvat @ 17.04.2011 - 19:31)
Я и думаю - вроде 0 и "о" далеко находятся, мб что-то другое хотели сказать..

У меня на расстоянии одной клавиши... Но у меня раскладка не английская, может поэтому.

Спустя 4 минуты, 14 секунд (17.04.2011 - 21:40) neadekvat написал(а):
Цитата (waldicom @ 17.04.2011 - 22:36)
Мне жаль Ваших пользователей.

Да-да, все, я уже деспот и говнокодер smile.gif
Цитата (waldicom @ 17.04.2011 - 22:36)
надо просто использовать другую функцию

Вот пусть ТС ее и поищет.
Правда, спасибо за напоминание о 16-х числах: дьявол - в деталях.
Цитата (waldicom @ 17.04.2011 - 22:36)
У меня на расстоянии одной клавиши... Но у меня раскладка не английская, может поэтому.

А блин, я ж вам ответ типа по-русски писал - поэтому и позиции русской "о" описал smile.gif

Спустя 28 минут, 38 секунд (17.04.2011 - 22:09) neadekvat написал(а):
Цитата (uWeb @ 17.04.2011 - 22:59)
function is_assoc($array) {
return is_numeric($array[0]) ? true : false;
}

uWeb, это че за хрень? о_О

Спустя 13 секунд (17.04.2011 - 22:09) inpost написал(а):
neadekvat
В любом случае я не вижу смысла уподобаться извращениям ради того, чтобы показать, на сколько "ты крут", за всю жизнь ни разу не встречу такое использование, я в этом уверен.
Как говорит Сергеис, не ясна суть вопроса полностью, в данном случае если предпологается работа внутри своего сайта, то сам же извращениями не будешь заниматься. Если бы в вопросе стояло, что сайт чужой и с таким вот извращением, то стоило бы искать фикс специально под конкретный случай.

Спустя 2 минуты, 44 секунды (17.04.2011 - 22:12) neadekvat написал(а):
inpost, не каждую задачу можно и нужно решать влоб. Не надо везде липить циклы, переборы и т.д. Если можно решить обходным путем - почему бы и нет? Мой вариант когда выглядет не сложнее, чем твой, не считая редкоиспользуемой функции.

Спустя 43 минуты, 28 секунд (17.04.2011 - 22:56) uWeb написал(а):
neadekvat, вообще полная хрень, сам не понял что сказал.

Спустя 1 минута, 55 секунд (17.04.2011 - 22:57) Игорь_Vasinsky написал(а):
neadekvat
Цитата
uWeb, это че за хрень? о_О


новый термин: полу-тернарная функция wink.gif

Спустя 4 минуты, 2 секунды (17.04.2011 - 23:01) neadekvat написал(а):
Цитата (Игорь_Vasinsky @ 17.04.2011 - 23:57)
новый термин: полу-тернарная функция

С синтаксисом там все в порядке.
А вот с логикой..

Спустя 7 часов, 32 минуты, 53 секунды (18.04.2011 - 06:34) Dr.Mars написал(а):
похапешники, я люблю твороженные булочки biggrin.gif

Спустя 1 минута (18.04.2011 - 06:35) neadekvat написал(а):
Цитата (Dr.Mars @ 18.04.2011 - 07:34)
похапешники похапешники, я люблю твороженные булочки  biggrin.gif

Ява женского рода, тролль.

Спустя 3 часа, 50 минут, 30 секунд (18.04.2011 - 10:26) eurobax написал(а):
Парни, я весьма удивлен что из моей мухи слона сделали smile.gif
Все зависит в первую очередь, от задачи, иногда универсальность это зло.

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

$arr['0x0ffabe'] - такое может встретиться только в скрипте, в результате маниакальной нелюбви к кодингу. В награду этому идиоту я посчитаю его массив ассоциативным и на этом программа не сдохнет, просто сериализуется в большее число байт и все. У меня в этом был весь вопрос.

А так, спасибо, что соболезнуете мне про отсутствие подобной стандартной функции.

Спустя 9 месяцев, 7 дней, 23 часа, 26 минут, 47 секунд (26.01.2012 - 09:53) Гость_ddvhouse написал(а):
Нельзя просто смотреть is_numeric для проверки на индексность массива. Там важно, что б ключи были не просто числовыми, а еще и по-порядку, начиная с 0.
Решение - только перебор до ближайшего не совпадения или через зад, вот так, например:

function is_index_array($array)
{
return (substr(json_encode($array), 0, 1) == '[');
}

Спустя 12 минут, 57 секунд (26.01.2012 - 10:06) inpost написал(а):
Какой-то велосипед.
2 простых варианта:
if(isset($array[0])) // если в чистом виде.
//или

foreach($array as $k=>$v) {
$info = (is_numeric($k) ? 'index' : 'assoc'); break;
}

Спустя 3 минуты, 20 секунд (26.01.2012 - 10:09) Гость_ddvhouse написал(а):
Цитата (inpost @ 26.01.2012 - 07:06)
Какой-то велосипед.
2 простых варианта:
if(isset($array[0])) // если в чистом виде.
//или

foreach($array as $k=>$v) {
$info = (is_numeric($k) ? 'index' : 'assoc'); break;
}

inpost
Оба варианта не решат вопрос с массивом (0='asd', 2=>'qwe') - так как это уже не индексный массив.

Спустя 3 минуты, 19 секунд (26.01.2012 - 10:12) inpost написал(а):
Гость_ddvhouse
Вообще-то это индексный. В котором один из значений просто был убран!

Спустя 55 минут, 52 секунды (26.01.2012 - 11:08) Guest написал(а):
inpost, на то он и индексный, что в нём если всё ключи по порядку. Иначе, какой же это индекс.
В правильном индексном массиве, если был удалён один элемент, то все ключи сдвигаются, так что count($a)-1 - всегда последний элемент массива.
PHP с индексными массивами, фактически, сам не работает. Для него все массивы - ассоциативные. Даже, если там числовые ключи.

Еще пример:
array(1=>'asdsad', 0=>'1223') - тоже не индексный и тоже пройдет по вашим алгоритмам.

Спустя 2 минуты, 13 секунд (26.01.2012 - 11:10) ddvhouse написал(а):
О, я, оказывается, тут зареган.
Коряво предложение написал. Имел ввиду:
Цитата
на то он и индексный, что в нём если всё ключи по порядку. Иначе, какой же это индекс.

Спустя 6 минут, 20 секунд (26.01.2012 - 11:17) inpost написал(а):
Цифра - это и есть индекс. И пример - тоже является индексным.
Вот в мануале можно посмотреть, что такой массив называют ИМЕННО ИНДЕКСНЫМ, а не ассоциативным:
http://php.net/manual/en/function.array.php

Там в нескольких примерах одно и то же показано, но зацитирую лишь 1 строчку:
Example #3 1-based index with array()
$firstquarter = array(1 => 'January', 'February', 'March');

1 - индекс, а не КЛЮЧ массива.

Или:
http://ru.wikipedia.org/wiki/%D0%98%D0%BD%...%D0%B8%D0%B2%29
n («индекс началом с n»)
базисный индекс массива может быть свободно выбран. Обычно языки программирования, позволяющие «индекс началом с n», разрешают также в качестве индекса массива выбирать отрицательные значения, а также и другие скалярные типы данных, как перечисления или символы.

Спустя 17 минут (26.01.2012 - 11:34) ddvhouse написал(а):
Цитата (inpost @ 26.01.2012 - 13:17)
Или:
http://ru.wikipedia.org/wiki/%D0%98%D0%BD%...%D0%B8%D0%B2%29
n («индекс началом с n»)
базисный индекс массива может быть свободно выбран. Обычно языки программирования, позволяющие «индекс началом с n», разрешают также в качестве индекса массива выбирать отрицательные значения, а также и другие скалярные типы данных, как перечисления или символы.

Если опираться на "или", то тогда не понятна часть про "символы".
array('a'=>'asdasd', 'b'=>'sdfdsf')
В индексах - символы. Чем же тогда это отличается от ассоциативного массива?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.