п.с. возможно тема уже в 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 - шаблон совпадения, либо строка, либо массив
Результат:
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) | ||
Рекурсия нужна когда уровней вложения больше двух, или не известно заранее их количество, при той структуре что показал, достаточно моего варианта. |
да я вот как раз и об этом хотел сказать, сейчас то вроде только двухуровневый массив, но кто его знает... Может я его даже сокращу в дальнейшем, а может и увеличу.
Спустя 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 - оствавит ключ в живых, но удалит ключ в массива-элементе по найденному совпадению.
Вообщем в итоге
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[твое значение][твое значение])
unset($array[твое значение]) -полностью сносит
если двумерен unset($array[твое значение][твое значение])
Спустя 4 часа, 54 минуты, 6 секунд (27.05.2012 - 03:38) Stasonix написал(а):
Цитата (Zzepish @ 26.05.2012 - 19:44) |
а unset() уже не в моде? unset($array[твое значение]) -полностью сносит если двумерен unset($array[твое значение][твое значение]) |
у меня ключ не совпадает со значением, вообще ключ неизвестен был. Спасибо за внимание, я уже писал что тема закрыта.