array_map — переданный аргумент должен иметь тип массива, строка с ошибкой

Я не уверен, почему следующее не работает. Я получаю вышеуказанную ошибку (тема):

$array = array (); //something goes in here

function del_space(array $a){
foreach($a as $key => $value){
    preg_replace("/; +/", "", $value); 
    }
}

$no_space = array_map("del_space", $array); 

person Community    schedule 13.06.2018    source источник
comment
Какая линия? Ошибка кажется самоочевидной.   -  person Script47    schedule 13.06.2018
comment
Я передаю ему массив, и он дает мне сообщение, что это строка. Я проверяю это с помощью is_array() на одну строку выше кода. Это укороченная версия. Это взято из того, что я пишу в IDE.   -  person    schedule 13.06.2018
comment
массив пустой?   -  person Liam G    schedule 13.06.2018
comment
eval.in/1020730 — посмотрите.   -  person    schedule 13.06.2018
comment
Если вы ищете пробел в массиве, просто используйте встроенную функцию trim();   -  person Mawia HL    schedule 13.06.2018
comment
Разместите свой фактический код в своем фактическом вопросе. Код, на который вы ссылаетесь на eval.in, содержит дополнительный оператор, который является источником вашей ошибки.   -  person Sammitch    schedule 13.06.2018


Ответы (2)


Ваша функция del_space принимает в качестве аргумента массив. array_map берет каждый элемент массива (второй аргумент) и отправляет его обратному вызову (первый аргумент). Так что, если у вас есть массив массивов, это не сработает. Ваш пример должен выглядеть так:

$array = ['lblab; la'];

function del_space($a){
    return preg_replace("/; +/", "", $a); 
}

$no_space = array_map("del_space", $array);
print_r($no_space);

Дает вывод:

Array ( [0] => lblab;la)

Если вы хотите передать массив массивов, ввод должен выглядеть так:

$array = [
     ['blabla; bla'],
     ['blabla2; bla2'],
];

function del_space(array $a){
    foreach($a as $key => $value){
        $a[$key] = preg_replace("/; +/", "", $value); 
    }

    return $a;
}

$no_space = array_map("del_space", $array);
print_r($no_space);

С выходом:

Array ( [0] => Array ( [0] => blablabla ) [1] => Array ( [0] => blabla2bla2 ) )
person spielerds    schedule 13.06.2018
comment
Понял, спасибо! Это самый первый день, когда я пишу код, но после примерно 11 месяцев теоретического обучения. Спасибо! Как долго поправляться/ощущать прогресс, если можно поинтересуюсь? - person ; 13.06.2018
comment
Пожалуйста, я рад, что у вас все получилось. Трудно сказать, я думаю, что с PHP относительно легко изучить основы, но каждый день есть чему учиться :) php.net — отличная отправная точка, там есть подробное описание каждой функции с множеством примеров. - person spielerds; 13.06.2018

array_map() зацикливает $array для вас, и поэтому я предполагаю, что каждый элемент внутри $array не является объектом массива, но del_space() требует передачи ему массива.

Похоже, у вас есть:

$array = array( 'some item' ); // Fails

но вам нужно что-то вроде:

$array = array( array( 'some item' ) ); // Success

если вы хотите использовать array_map()

person MonkeyZeus    schedule 13.06.2018
comment
Проверьте URL-адрес eval.in. Это массив, и он не работает. - person ; 13.06.2018
comment
@gs3 У меня встреча, я проверю позже. - person MonkeyZeus; 13.06.2018