Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: PHP. Небольшая задачка с массивами.  (Прочитано 8725 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« : 15-06-2004 12:44 » 

Вот такая задачка:
Есть массив неизвестного содержания. Нужно определить, чем массив является - "чистым" массивом или хешем.

Поясню терминологию. В perl-е массивы и хеши - разные типы. Массивы индекстируются диапазоном целых чисел от 0 до N, а хеши произвольными строками. В php их зачем то смешали. В php "нормальные" массивы еще порой именуют списками (list).

Простейшее решение, которое приходит на ум, это проитись по всему массиву и проверить значения - являются ли они все числами. Но тут есть изъян - в "нормальном" массиве индексы должны быть по порядку и без пропусков. Да и оптимизировать не плохо бы было - без перебора.

У меня есть наметки, как действовать, но было бы интересно увидеть другие решения.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #1 : 15-06-2004 13:10 » 

Цитата: RXL
Простейшее решение, которое приходит на ум, это проитись по всему массиву и проверить значения - являются ли они все числами. Но тут есть изъян - в "нормальном" массиве индексы должны быть по порядку и без пропусков. Да и оптимизировать не плохо бы было - без перебора.


Насчёт  - в "нормальном" массиве индексы должны быть по порядку и без пропусков - можно использовать пхпэшные функции для работы с массивами :
sort - Sort an array
uasort - Sort an array with a user-defined comparison function and maintain index association
uksort - Sort an array by keys using a user-defined comparison function
usort - Sort an array by values using a user-defined comparison function
arsort - Sort an array in reverse order and maintain index association
asort - Sort an array and maintain index association
krsort - Sort an array by key in reverse order
ksort - Sort an array by key
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 15-06-2004 13:25 » 

Вот простое и надежное решение с перебором:
Код:
$n=0;
foreach)$arr as $k=>$v:
    if)$k==$n: $n++;
    else break;
if)$n==count)$arr:: echo "массив";
else echo "хеш";

Просто, хотелось бы понять тип массива, чтобы применить разные метобы обработки.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Skubent
Гость
« Ответ #3 : 15-06-2004 13:54 » 

ИМХО, любая сортировка будет медленнее полного перебора.
RXL, мне кажется что вариант
Код:

 flag {= true;
 for)$i=0; $i<sizeof)$arr:; $i++:
 | if )!isset)$arr[$i(:: |flag{=false; break;" "
 if )$flag: echo "массив"; else echo "хеш";

несколько предпочтительнее - в случае "неправильного" массива не будет бессмысленно прокручивать цикл.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 15-06-2004 14:11 » 

В чем может заключаться оптимизация - в использовании библиотечный ф-ий. Они, все таки, на C написаны. Да и книги тому же учат - "если что-то можно сделать с помошью встроенных ф-ий, то не следует делать это вручную - будет только медленне". Вот только как... Пока реализовал этот "тупой" метод.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Skubent
Гость
« Ответ #5 : 16-06-2004 06:30 » 

RXL, php в принцпе не любит разбираться с типами переменных... И из встроенных функций есть только набор is_array, is_string и т.п. Так что "тупые методы" рулят в твоих задачах Улыбаюсь.

Кстати говоря, в тех же учебниках пишут, что функции использовать полезно. А для пхп сие утверждение как минимум, спорно.
Записан
Fireworm
Гость
« Ответ #6 : 16-06-2004 06:52 » 

RXL, В PHP массив, даже если является хешем, то у него всеравно есть индексные значения. Например:
$ar = array("first" => "red", "second" => "green");
$ar["first"] == $ar[0];
$ar["second"] == $ar[1];

Может тебе это поможет? Тогда можно однотипно обрабатывать разные типы массивов.
Записан
Skubent
Гость
« Ответ #7 : 16-06-2004 08:16 » 

Fireworm, однако
$ar = array(0=>"red", "first"=>"green", 1=>"yellow");
элемент "green" не имеет числового индекса.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines