array_walk vs utf-8

mehanic

Новичок
array_walk vs utf-8

Помогите, эта штука съест мой мозг!
Проблема: обойти массив и выкинуть ненужные элементы. Использую функцию array_walk.
Массив вида array( 0 => 'значение1',...... ); Значения кирилличные и в кодировке UTF-8.

function myFunc( $myVar ){

$set = ....//инициализация булева значения

return $set;
}


$myArray = array( 0 => 'значение1',...... );

array_walk( $myArray, 'myFunc' );

var_dump( $myArray );

Так вот array_walk, пробегая по массиву, портит все значения. Точнее, вместо буквы "л" прилетает кракозябрик. Функция как бы переводит его в вин кодировку. Понятно, что можно по другому реализовать, но хочу понять в чем тут трабл.
 

Gas

может по одной?
Users may not change the array itself from the callback function. e.g. Add/delete elements, unset elements, etc. If the array that array_walk() is applied to is changed, the behavior of this function is undefined, and unpredictable.
@manual

И вообще как-то ты странно функцию используешь.
 

mehanic

Новичок
en_GB.utf8

-~{}~ 17.04.08 16:30:

ну с вин кодировкой все идеально работает :(
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
mehanic
Что-то ты недоговариваешь
 

mehanic

Новичок
Все как на духу.
Эта конструкция идеально обрабатывает массив, где значения в кодировке windows-1251, но если значения в кодировке UTF-8, то все буквы "л" превращаются в нечитаемый символ.
 

StUV

Rotaredom
mehanic
если массив обойти foreach с той же функцией - все ок ?
 

mehanic

Новичок
Да функция там не при чем. Я там тупо ставил return true; - та же ерунда. Тут именно array_walk так косячит. Скорее всего "the behavior of this function is undefined, and unpredictable".

Грустно.
 

Gas

может по одной?
Я привёл цитату на действия
обойти массив и выкинуть ненужные элементы.
буквы "л" это не касалось. Какое значение ты вкладываешь в return внутри фукции и вообще что ты внутри неё делаешь? У меня при изменении значений элементов массива проблем с "л" не возникает.
 

mehanic

Новичок
Автор оригинала: Gas
Какое значение ты вкладываешь в return внутри фукции и вообще что ты внутри неё делаешь?
Это следует знанию работы функции array_walk. В данном контексте возвращаемое true означает "не трогать элемент", false - "уничтожить элемент, выкинуть из массива". Нет никакого значения в том, что происходит внутри. Значение имеет только возвращаемое булево значение. Для вин-кодировки это работает безупречно.

-~{}~ 17.04.08 19:50:

Автор оригинала: StUV
mehanic
т.е. тупо, без

function myFunc($var) {return true;}
и все-равно косяки ?..
или все-таки все по ману ? =)

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

Gas

может по одной?
возвращаемое true означает "не трогать элемент", false - "уничтожить элемент, выкинуть из массива"
откуда такая информация? в мане об этом я ни строчки не вижу, практика показывает что return тоже ни на что не влияет.
 

mehanic

Новичок
Автор оригинала: Gas
откуда такая информация? в мане об этом я ни строчки не вижу, практика показывает что return тоже ни на что не влияет.
Экхм... Проверь. Не откатал, но если есть синтаксические ошибки - всплывет.

function myFunc( $myVar ){

$set = $myVar == 'значение3';

return $set;
}

$myArray = array( 'значение1', 'значение2', 'значение3' );

array_walk( $myArray, 'myFunc' );

var_dump( $myArray );
 

Gas

может по одной?
php4.4.8 и php5.2.5
как и ожидалось выдают

array(3) {
[0]=>
string(17) "значение1"
[1]=>
string(17) "значение2"
[2]=>
string(17) "значение3"
}

у тебя другой результат ?
 

mehanic

Новичок
у меня
array(1) {
[0]=>
string(9) "значение3"
}

Ладно, вопрос снят. Чудеса на виражах. Проще написать через форич генерацию дополнительного массива. Спасибо за участие, ребята.
 

Gas

может по одной?
mehanic
Можешь обновиться до последней версии php, но в любом случае, удаления элементов от array_walk хотеть не стоит.
 
Сверху