[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: многомерный массив - проверить пуст ли?
PyccHeBa
Привет, вот такая проблема надо проверить массив типа
Array (
[0]=>Array (
[0] =>"text"
[1] =>"text"
[2] =>"text"
)

[1] =>Array (
[0] =>""
[1] =>""
[2] =>"text"
)
)

Может быть 1 мерный, 2х мерный или трех мерный. Как это сделать? Только foreach или можно как то проще?



Спустя 50 минут, 40 секунд (19.06.2009 - 05:43) kirik написал(а):
Цитата (PyccHeBa @ 18.06.2009 - 20:52)
Только foreach или можно как то проще?

Думаю что только foreach (или while)..

Спустя 2 часа, 45 минут, 27 секунд (19.06.2009 - 08:28) glock18 написал(а):
Смотря что конкретно с ним надо сделать. В php есть рекурсивных функций для работы с массивами. Может одна из них подойдет?

Спустя 43 минуты, 10 секунд (19.06.2009 - 09:11) sergeiss написал(а):
Наверное, только через foreach. Но если написать одну небольшую функцию, то задача станет простой smile.gif Причем, мерность массива будет уже не важна.
Текст я писать не буду, он несложный. Я только алгоритм опишу.
Эта функция должна брать в качестве параметра исходный массив. Далее, идем по циклу по всем элементам массива. Проверяем тип элемента: если массив, то вызываем ту же функцию, передавая в качестве параметра этот вложенный массив. А если не массив, то проверяем этот элемент на пустоту.
Далее, ежели элемент НЕ пустой, то возвращаем FALSE как индикатор того, что массив не пустой. Если же в данном массиве все элементы пустые, то возвращаем TRUE, потому что массив пуст.
При этом, какова бы ни была вложенность массивов, мы всегда доберемся до элементов, не являющихся массивами.
В итоге пробежим по всем элементам этого "дерева", ежели они все пустые. А ежели не пустые, то после первого же непустого элемента уже можно принимать об этом решение и завершать работу функции.

Спустя 5 дней, 6 часов, 1 минута, 56 секунд (24.06.2009 - 15:13) PyccHeBa написал(а):
да, только через форич. Немного не по теме, вот функция для удобного отбражения массивов содержащих html теги, до 2х мерных массивов передает. Удобно при парсинге. Мелочь, но может кому пригодится

PHP
function showArr($m) {
      if (
is_array($m))
        foreach (
$m as $key => $val) {
            if (
is_array($m[$key])) {
                foreach (
$m[$key] as $key2 => $val2) {
                            
$m[$key][$key2] = htmlspecialchars($val2);
                            }
                    }
              else 
$m[$key]=htmlspecialchars($m[$key]);
              }
              else 
$m htmlspecialchars($m);
            echo 
"<pre>";
            
print_r($m);
            echo 
"</pre>";  
     }

Спустя 1 час, 24 минуты, 40 секунд (24.06.2009 - 16:38) Sylex написал(а):
PyccHeBa
через рекурсию надо делать

вот хорошая функция:
http://ru.php.net/array_map

wink.gif

Спустя 12 минут, 43 секунды (24.06.2009 - 16:50) glock18 написал(а):
Sylex, есть еще круче для этого wink.gif
array_walk_recursive

Спустя 9 минут, 34 секунды (24.06.2009 - 17:00) Sylex написал(а):
glock18
знамо, один фиг smile.gif

Спустя 2 часа, 56 минут, 8 секунд (24.06.2009 - 19:56) glock18 написал(а):
Sylex
та лан smile.gif
там атна строчка будет smile.gif

PS: правда про нее написано user-defined functions для callback. так что мало ли. может и не прокатить она.

Спустя 10 часов, 1 минута, 24 секунды (25.06.2009 - 05:58) Sylex написал(а):
glock18
конечно, не проканает wink.gif

Спустя 3 часа, 10 минут, 13 секунд (25.06.2009 - 09:08) glock18 написал(а):
Sylex
я настырный ваапще та smile.gif и ленивый smile.gif не захочу делать в цикл, если хочу сделать одной строкой. введу функцию

PHP
function UserdefinedHtmlentities(<те же параметры что в html_entitiesну или подгон в случае их расхождения с темчто нужно walk>)
{
    return 
html_entities(<переданные параметры>);
}


чтобы успокоить свое маниакальное желание делать все на классах, положу функцию в класс, сделаю статической. и передаю в array_walk_recursive() ее массивом

PHP
array('myclass''UserdefinedHtmlentities');


и вот мне не пришлось делать цикл и я щастлив! smile.gif правда пришлось кучу всякого ненужного сделать - переопределить базовую функцию, можно в класс не засовывать, но я хочу smile.gif в общем, дело личных пристрастий. мне лениво цикл писать, а кому-то извращаться так же как я rolleyes.gif

Спустя 4 минуты, 48 секунд (25.06.2009 - 09:13) sergeiss написал(а):
glock18 - а объясни, плз, как быть, если у тебя массив многомерный? Как твой callback будет работать? Чегой-то я не понял.

Спустя 8 минут, 56 секунд (25.06.2009 - 09:22) sergeiss написал(а):
Если делать "в лоб", то можно так:

PHP
function empty_array( $arr )
{
  if( empty( $arr ) ) return true; // если уже пусто
  elseif( is_array( $arr ) ) // проверка массивов
  {
    foreach( $arr as $a )
    {
      if( empty_array( $a ) ) return true; // рекурсивный вызов функцией самой себя, но на один уровень массива глубже
    }
    return false;
  }
  else // для простых переменных
    return empty( $arr ); 

  return true
;
}

// и вызов функции
$a=......
if(
 empty_arr( $a ) ) echo 'Массив пуст';

Спустя 12 минут, 37 секунд (25.06.2009 - 09:34) glock18 написал(а):
sergeiss, так мы же как раз про многомерные. array_walk_recursive проходит рекурсивно по массиву, применяя к элементам функцию.

Только поправлю тебя малость - мы здесь немного уже оффтоп smile.gif Уже про обработку массива - PyccHeBa запостил(а?) выше сообщение.

твоя функция чистый пример применения C на php smile.gif написана грамотно, но не учитывает, что есть функции встроенные. хотя для проверки на пустоту может лучше подходит даже.

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

ну типа

PHP
public static function UserdefinedHtmlentities(<те же параметры что в html_entitiesну или подгон в случае их расхождения с темчто нужно walk>)
{
    if (
self::$empty)
      return;

    if (empty(
$item))
      
self::$empty true;
}


вот как-то так.

Спустя 3 часа, 50 минут, 39 секунд (25.06.2009 - 13:25) Sylex написал(а):
мудрено....

PHP
<?php

function quots($text)
{
    if (
is_array($text)) {
        
$text array_map('quots'$text);
    } elseif ( !
is_numeric($text) ) {
            
$text htmlspecialchars($text);
        }
    return 
$text;
}

$res = array(
    array(
'Хорошо что мы <"живем">''гы><''&угу'),
    array(
'работает <html>''<code>'0),
);

$res quots($res);

print_r($res);


и никаких циклов.

Спустя 11 минут, 18 секунд (25.06.2009 - 13:36) glock18 написал(а):
Да, у тебя лучше решение smile.gif


_____________
Быстрый ответ:

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