[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Массивы
Stasonix
собств. сабж. Нужно это сделать так, чтобы не оставалось пустых элементов после этого.

п.с. возможно тема уже в 100-й раз поднимается, но не оказалось у меня под рукой функции, в гугле в основном одномерные примеры.

Да, и еще, ключ заранее неизвестен как вы уже догадались.



Спустя 14 минут, 4 секунды (23.05.2012 - 14:10) killer8080 написал(а):

Спустя 10 минут, 57 секунд (23.05.2012 - 14:21) Stasonix написал(а):
что-то я не дотягиваю:


// удалить элемент, там где значние == green
$arr = array('key1'=>array('foo'=>'myvalue'),'key2'=>array('foo'=>'green'));

function RemEl($var)
{
// no-comprende
}

array_filter($arr,'RemEl');

echo "<pre>";
var_dump($arr);
echo "</pre>";

Спустя 4 минуты, 29 секунд (23.05.2012 - 14:25) Stasonix написал(а):
причем нужно удалить ни элемент foo, а вообще key2, надеюсь догадались.

Спустя 4 минуты, 20 секунд (23.05.2012 - 14:30) Игорь_Vasinsky написал(а):
вот и разминулся ))))))))))))))))))

рекурсивная функция для чистки многомерного массива от пустых элементов
(ключи сохраняются)

<?php
function
clearArray($array)
{
if(is_array($array))
{
foreach($array as $key=>$value)
{
if(is_array($value))
$array[$key] = clearArray($value);
else
if
($value == '')
unset($array[$key]);
}
}


return $array;
}

//Жертва
$array = array(121, '', 234234, 3432, 232323423, array('', 12, 1212, array('', 121, 23, 332)));

echo ' Before: <pre>' . print_r($array, 1) . '</pre>';

echo ' After: <pre>' . print_r(clearArray($array), 1) . '</pre>';

?>


результат:

Before:
Array
(
[0] => 121
[1] =>
[2] => 234234
[3] => 3432
[4] => 232323423
[5] => Array
(
[0] =>
[1] => 12
[2] => 1212
[3] => Array
(
[0] =>
[1] => 121
[2] => 23
[3] => 332
)

)

)
After:
Array
(
[0] => 121
[2] => 234234
[3] => 3432
[4] => 232323423
[5] => Array
(
[1] => 12
[2] => 1212
[3] => Array
(
[1] => 121
[2] => 23
[3] => 332
)

)

)


хотя я бы при создании массива за эти следил))

Спустя 5 минут, 28 секунд (23.05.2012 - 14:35) killer8080 написал(а):
// удалить элемент, там где значние == green
$arr = array('key1'=>array('foo'=>'myvalue'),'key2'=>array('foo'=>'green'));


foreach($arr as &$arr2)
$arr2 = array_filter($arr2, create_function('$v', 'return $v != "green";'));
unset($arr2);
$arr = array_filter($arr);
echo "<pre>".print_r($arr, 1).'</pre>';

так?

UPD подправил

Спустя 2 минуты, 30 секунд (23.05.2012 - 14:38) Игорь_Vasinsky написал(а):
или даже так

2й аргумент $pattern - шаблон совпадения, либо строка, либо массив

<?php
function
clearArray($array, $pattern)
{
if(is_array($array))
{

foreach($array as $key=>$value)
{
if(is_array($value))
$array[$key] = clearArray($value, $pattern);
else
{
if(is_array($pattern))
if(in_array($value, $pattern))
unset($array[$key]);
else
if
($value == $pattern)
unset($array[$key]);
}
}
}


return $array;
}

$array = array(121, '', 234234, 3432, 232323423, array('', 12, 1212, array('', 121, 23, 332)));

echo ' Before: <pre>' . print_r($array, 1) . '</pre>';

#Удалим все пустые элементы и элементы = 12
echo ' After: <pre>' . print_r(clearArray($array, array(12, '')), 1) . '</pre>';

?>


Результат:

Before:
Array
(
[0] => 121
[1] =>
[2] => 234234
[3] => 3432
[4] => 232323423
[5] => Array
(
[0] =>
[1] => 12
[2] => 1212
[3] => Array
(
[0] =>
[1] => 121
[2] => 23
[3] => 332
)

)

)
After:
Array
(
[0] => 121
[2] => 234234
[3] => 3432
[4] => 232323423
[5] => Array
(
[2] => 1212
[3] => Array
(
[1] => 121
[2] => 23
[3] => 332
)

)

)

Спустя 10 минут, 1 секунда (23.05.2012 - 14:48) Stasonix написал(а):
Игорь_Vasinsky
То ли лыжи ни едут..



// удалить элемент key, там где значение == green
$arr = array('key1'=>array('foo'=>'myvalue'),'key2'=>array('foo'=>'green'));

$useful = new Useful();

$arr = $useful->clearArray($arr,'green');

echo "<pre>";
var_dump($arr);
echo "</pre>";


результат:


array(2) {
["key1"]=>
array(1) {
["foo"]=>
string(7) "myvalue"
}
["key2"]=>
array(1) {
["foo"]=>
string(5) "green"
}
}

Спустя 3 минуты, 51 секунда (23.05.2012 - 14:52) Игорь_Vasinsky написал(а):
)) нет так не сработает. надо подумать.

Спустя 3 минуты, 46 секунд (23.05.2012 - 14:55) killer8080 написал(а):
Stasonix
а тебе нужна рекурсия?

Спустя 5 минут, 57 секунд (23.05.2012 - 15:01) Stasonix написал(а):
Цитата (killer8080 @ 23.05.2012 - 11:55)
Stasonix
а тебе нужна рекурсия?

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

Как видите я там в класс Useful ее запихнул (вашу функцию), там рекурсией через $this->clearArray(), но все-равно не сработало.

Спустя 4 минуты, 14 секунд (23.05.2012 - 15:06) Игорь_Vasinsky написал(а):
)) 3й аргумент 1 - удалять ключ если 'элемент явл-я массивом

 function clearArray($array, $pattern, $deleteifarray = 1)
{
if(is_array($array))
{

foreach($array as $key=>$value)
{
if(is_array($value))
{
if($deleteifarray == 1)
{
foreach($value as $subkey=>$subvalue)
{
if(in_array($subvalue, $pattern))
unset($array[$key]);
}
}

else
$array[$key] = clearArray($value, $pattern);
}
else
{
if(is_array($pattern))
if(in_array($value, $pattern))
unset($array[$key]);

else
if
($value == $pattern)
unset($array[$key]);
}
}
}


return $array;
}

#$array = array(121, '', 234234, 3432, 232323423, array('', 12, 1212, array('', 121, 23, 332)));
$array = array('key1'=>array('foo'=>'myvalue'),'key2'=>array('foo'=>'green'));

echo ' Before: <pre>' . print_r($array, 1) . '</pre>';

echo ' After: <pre>' . print_r(clearArray($array, array('green'), 1), 1) . '</pre>';

?>


Before:
Array
(
[key1] => Array
(
[foo] => myvalue
)

[key2] => Array
(
[foo] => green
)

)
After:
Array
(
[key1] => Array
(
[foo] => myvalue
)

)

Спустя 5 минут, 36 секунд (23.05.2012 - 15:11) killer8080 написал(а):
Цитата (Stasonix @ 23.05.2012 - 15:01)
Цитата (killer8080 @ 23.05.2012 - 11:55)
Stasonix
а тебе нужна рекурсия?


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

Рекурсия нужна когда уровней вложения больше двух, или не известно заранее их количество, при той структуре что показал, достаточно моего варианта.

Спустя 6 минут, 14 секунд (23.05.2012 - 15:17) Stasonix написал(а):
Игорь_Vasinsky
Спасибо!

$arr = $useful->clearArray($arr,array('green'),1);



array(1) {
["key1"]=>
array(1) {
["foo"]=>
string(7) "myvalue"
}
}


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

Спустя 1 минута, 7 секунд (23.05.2012 - 15:19) Stasonix написал(а):
Цитата (killer8080 @ 23.05.2012 - 12:11)
Цитата (Stasonix @ 23.05.2012 - 15:01)
Цитата (killer8080 @ 23.05.2012 - 11:55)
Stasonix
а тебе нужна рекурсия?


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

Рекурсия нужна когда уровней вложения больше двух, или не известно заранее их количество, при той структуре что показал, достаточно моего варианта.

да я вот как раз и об этом хотел сказать, сейчас то вроде только двухуровневый массив, но кто его знает... Может я его даже сокращу в дальнейшем, а может и увеличу.

Спустя 36 секунд (23.05.2012 - 15:19) Игорь_Vasinsky написал(а):
это универсальная, функция с параметрами, только акцентирована на совпадение на поиск в элементах, а не ключах. а так - это универсал для массивов с любым уровнем вложенности.

Спустя 1 минута, 2 секунды (23.05.2012 - 15:20) Игорь_Vasinsky написал(а):
2й аргумент может быть и строкой))

$arr = $useful->clearArray($arr,'green',1);

Спустя 26 секунд (23.05.2012 - 15:21) Stasonix написал(а):
Вот и отлично!

Спустя 1 минута, 7 секунд (23.05.2012 - 15:22) Stasonix написал(а):
Цитата (Игорь_Vasinsky @ 23.05.2012 - 12:20)
2й аргумент может быть и строкой))

$arr = $useful->clearArray($arr,'green',1);

у меня так ошибку возвращает:

in_array() expects parameter 2 to be array, string given

Спустя 1 минута, 53 секунды (23.05.2012 - 15:24) Игорь_Vasinsky написал(а):
лан. значит массив тока.

Вообщем в итоге

1 аргумент - жертва (массив)
2 аргумент - шаблон поиска (строка, массив)
3 аргумент - 1 - удалит ключ, если элемент этого ключа массив и найдено совпадение, 0 - оствавит ключ в живых, но удалит ключ в массива-элементе по найденному совпадению.


 function clearArray($array, $pattern, $deleteifarray = 1)
{
if(is_array($array))
{

foreach($array as $key=>$value)
{
if(is_array($value))
{
if($deleteifarray == 1)
{
foreach($value as $subkey=>$subvalue)
{
if(is_array($pattern))
{
if(in_array($subvalue, $pattern))
unset($array[$key]);
}
else
{
if(in_array($pattern, $value))
unset($array[$key]);
}
}
}

else
$array[$key] = clearArray($value, $pattern);
}
else
{
if(is_array($pattern))
if(in_array($value, $pattern))
unset($array[$key]);
else
if
($value == $pattern)
unset($array[$key]);
}
}
}


return $array;
}

Спустя 3 минуты, 48 секунд (23.05.2012 - 15:27) Игорь_Vasinsky написал(а):
подправил. см выше. может и строка быть 2м аргументом.

Спустя 2 минуты, 53 секунды (23.05.2012 - 15:30) Stasonix написал(а):
Эврика! Практичней да, когда и строкой возможно.

Спустя 3 дня, 7 часов, 13 минут, 59 секунд (26.05.2012 - 22:44) Zzepish написал(а):
а unset() уже не в моде?
unset($array[твое значение]) -полностью сносит
если двумерен unset($array[твое значение][твое значение])

Спустя 4 часа, 54 минуты, 6 секунд (27.05.2012 - 03:38) Stasonix написал(а):
Цитата (Zzepish @ 26.05.2012 - 19:44)
а unset() уже не в моде?
unset($array[твое значение]) -полностью сносит
если двумерен unset($array[твое значение][твое значение])

у меня ключ не совпадает со значением, вообще ключ неизвестен был. Спасибо за внимание, я уже писал что тема закрыта.
Быстрый ответ:

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