Мне необходимо определить - индексный он, или ассоциативный для задачи нестандартной сериализации массива.
Не могу сообразить - как это сделать, не перебирая ключи и не проверяя что они - числа?
Спустя 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 - значит не индексный. (функцию написать)
запустил в цикле - если хотябы один false - значит не индексный. (функцию написать)
Спустя 6 минут (17.04.2011 - 18:42) eurobax написал(а):
Цитата (Игорь_Vasinsky @ 17.04.2011 - 15:36) |
наверно проверить все ключи на integer, а может и готовая функция в php уже есть. запустил в цикле - если хотябы один false - значит не индексный. (функцию написать) |
Именно так сейчас и делаю. Функции типа is_array_assoc нет
Спустя 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) |
Такое будет работать неверно (умалчивая уже об ужасном стиле, но это на функциональность не влияет)
Спустя 1 минута, 29 секунд (17.04.2011 - 20:51) denizkin написал(а):
inpost
Так чисто не в тему, название переменной $omg улыбнуло!
Так чисто не в тему, название переменной $omg улыбнуло!
Спустя 11 минут, 31 секунда (17.04.2011 - 21:03) Игорь_Vasinsky написал(а):
inpost
И улыбнулся на аватаре ! Молодец!
И улыбнулся на аватаре ! Молодец!
Спустя 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"
А насчет "давайте честно": я лично не видел. А еще я не видел кенгуру в живую.
Индексы массива, они же не только от руки даюются, они могут приходить из БД, из файлов или других источников.
И если программировать в надежде на то, что какая-то ситуация не проявится, то она обязательно проявится
Спустя 3 минуты, 2 секунды (17.04.2011 - 21:27) Игорь_Vasinsky написал(а):
чёт не получается вывести... различает, может потомц что:
is_numeric - определяет, является ли переменная числом или числовой строкой.
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) |
Мне жаль Ваших пользователей. |
Да-да, все, я уже деспот и говнокодер
Цитата (waldicom @ 17.04.2011 - 22:36) |
надо просто использовать другую функцию |
Вот пусть ТС ее и поищет.
Правда, спасибо за напоминание о 16-х числах: дьявол - в деталях.
Цитата (waldicom @ 17.04.2011 - 22:36) |
У меня на расстоянии одной клавиши... Но у меня раскладка не английская, может поэтому. |
А блин, я ж вам ответ типа по-русски писал - поэтому и позиции русской "о" описал
Спустя 28 минут, 38 секунд (17.04.2011 - 22:09) neadekvat написал(а):
Цитата (uWeb @ 17.04.2011 - 22:59) |
function is_assoc($array) { |
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, это че за хрень? о_О |
новый термин: полу-тернарная функция
Спустя 4 минуты, 2 секунды (17.04.2011 - 23:01) neadekvat написал(а):
Цитата (Игорь_Vasinsky @ 17.04.2011 - 23:57) |
новый термин: полу-тернарная функция |
С синтаксисом там все в порядке.
А вот с логикой..
Спустя 7 часов, 32 минуты, 53 секунды (18.04.2011 - 06:34) Dr.Mars написал(а):
похапешники, я люблю твороженные булочки
Спустя 1 минута (18.04.2011 - 06:35) neadekvat написал(а):
Цитата (Dr.Mars @ 18.04.2011 - 07:34) |
похапешники похапешники, я люблю твороженные булочки |
Ява женского рода, тролль.
Спустя 3 часа, 50 минут, 30 секунд (18.04.2011 - 10:26) eurobax написал(а):
Парни, я весьма удивлен что из моей мухи слона сделали
Все зависит в первую очередь, от задачи, иногда универсальность это зло.
В моей задаче индексный массив - это простые ключи - числа, ограничился перебором на первое несоответствие ключа числовому типу, как кто-то и предложил в начале.
$arr['0x0ffabe'] - такое может встретиться только в скрипте, в результате маниакальной нелюбви к кодингу. В награду этому идиоту я посчитаю его массив ассоциативным и на этом программа не сдохнет, просто сериализуется в большее число байт и все. У меня в этом был весь вопрос.
А так, спасибо, что соболезнуете мне про отсутствие подобной стандартной функции.
Все зависит в первую очередь, от задачи, иногда универсальность это зло.
В моей задаче индексный массив - это простые ключи - числа, ограничился перебором на первое несоответствие ключа числовому типу, как кто-то и предложил в начале.
$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 простых варианта:
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])) // если в чистом виде. |
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') - тоже не индексный и тоже пройдет по вашим алгоритмам.
В правильном индексном массиве, если был удалён один элемент, то все ключи сдвигаются, так что 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 строчку:
1 - индекс, а не КЛЮЧ массива.
Или:
http://ru.wikipedia.org/wiki/%D0%98%D0%BD%...%D0%B8%D0%B2%29
n («индекс началом с n»)
базисный индекс массива может быть свободно выбран. Обычно языки программирования, позволяющие «индекс началом с n», разрешают также в качестве индекса массива выбирать отрицательные значения, а также и другие скалярные типы данных, как перечисления или символы.
Вот в мануале можно посмотреть, что такой массив называют ИМЕННО ИНДЕКСНЫМ, а не ассоциативным:
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')
В индексах - символы. Чем же тогда это отличается от ассоциативного массива?