Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как 100%-но различить простой массив от ассоциативного?
 
 автор: Emm   (08.04.2011 в 05:54)   письмо автору
 
 

Сабж... например:
array(ноль, '1', 'пять', 'десять', 'четырнадцать', 58, 36); /* и */ array(0 => 'ноль', 1=>'1', 5 => 'пять', 10 => 'десять', 14 => 'четырнадцать', 58 => 58, 36 => 36);

  Ответить  
 
 автор: Саня   (08.04.2011 в 06:53)   письмо автору
 
   для: Emm   (08.04.2011 в 05:54)
 

В РНР нет чёткого разделения между индексированным и ассоциативным массивом. Можно сказать что все массивы являются ассоциативными.

Если принять за "простой" массив тот, у которого ключи всех элементов упорядочены и непрерывно возрастают от нуля, то можно отталкиваться от этого скрипта:
<?php

$a1 
= array('ноль''1''пять''десять''четырнадцать'5836);
$a2 = array(=> 'ноль'1=>'1'=> 'пять'10 => 'десять'14 => 'четырнадцать'58 => 5836 => 36);

$i 0;
$is_simple true;
foreach ( 
$a2 as $k => $v ) {
  if ( 
$k !== $i++ ) {
    
$is_simple false;
    break;
  }
}

if ( 
$is_simple ) {
  print 
'Массив простой';
} else {
  print 
'Массив ассоциативный';
}


100% гарантию может дать класс, внутри которого происходит контроль "простоты" массива.

  Ответить  
 
 автор: Красная_шляпа   (08.04.2011 в 12:33)   письмо автору
 
   для: Emm   (08.04.2011 в 05:54)
 


<?ПэХэПэ

    
function isNumericArray($array) {
        
$keys array_keys($array);
        foreach (
$keys as $key) {
            if (!
is_int($key)) {
                return 
false;
            }
        }
        return 
true;
    }

    function 
isAssociativeArray($array) {
        
$keys array_keys($array);
        foreach (
$keys as $key) {
            if (!
is_string($key)) {
                return 
false;
            }
        }
        return 
true;
    }


  Ответить  
 
 автор: Valick   (08.04.2011 в 12:47)   письмо автору
 
   для: Emm   (08.04.2011 в 05:54)
 

А лично меня интересует та задача в ходе решения которой возник данный вопрос.
Если не секрет, что за задача такая, зачем нужно 100%-но различить простой массив от ассоциативного?

  Ответить  
 
 автор: Emm   (08.04.2011 в 18:37)   письмо автору
 
   для: Valick   (08.04.2011 в 12:47)
 

У меня на основе многомерного массива формируется форма настроек, так вот, для формирования селекта и т.п., значение и название возможных вариантов настроек иногда не совпадает, для наглядности и простоты перебора - ключ и элемент массива соответствует значению и названию опции селекта, но не всегда есть необходимость указывать различное название от значения опции, и соответственно не нужно дублировать ключи массивов, незачем, вот тут я задумался как логически это разделить, в начале я просто проверял есть ли в массиве нулевой индекс, т.к. в простом массиве он всегда есть, а в ассоциативном небыло необходимости указывать, все было норм, но тут я совсем забыл что там тоже нужен ноль (именно число ноль, строка не канает ибо везде идет проверка на ноль, много переписывать), и как не крути ноль и в африке ноль, как тут проверять?

  Ответить  
 
 автор: psychomc   (08.04.2011 в 19:31)   письмо автору
 
   для: Emm   (08.04.2011 в 05:54)
 

есть еще такой подход:


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


хотя и не совсем универсальный

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования