Як передати елементи масиву в рядки в PHP?


74

Якщо у мене є масив з об’єктами:

$a = array($objA, $objB);

(кожен об'єкт має __toString()-метод)

Як я можу передати всі елементи масиву в рядок, щоб масив $aмістив не більше об'єктів, крім їх рядкового представлення? Чи існує однокласний вкладиш, чи мені доводиться вручну перебирати масив?


ви заглядали на php.net/array_map ?
Kemo


@RohitSuthar: зв’язана відповідь створює масив із рядка. Це питання стосувалось перетворення масиву об’єктів у масив їх рядкового представлення.
acme

Відповіді:


167

Однокласний вкладиш:

$a = array_map('strval', $a);
// strval is a callback function

Див. PHP DOCS:

карта_масиву

strval

Насолоджуйтесь! ;)


2
Блін, як би я знав це, перш ніж розміщувати свою відповідь. +1
Бен Еверард,

2
імплодувати (',', array_map ('strval', $ a)); робитиме роботу Prolly
Kemo

2
@Kemo: Я не думаю, що він хоче цього робити.
Алікс Аксель

Прекрасно, це було те, що я хотів! Дякую!
acme

1
Як це зробити для багатовимірного масиву?
Yatin Mistry

2

Не перевірено, але щось подібне повинно це зробити?

foreach($a as $key => $value) {
    $new_arr[$key]=$value->__toString();
}
$a=$new_arr;

прочитайте питання, там написано "чи є однокласний вкладиш, чи мені доводиться робити цикл вручну ..." :)
Kemo

1
Так, і як я запропонував у коментарі до допису Alix, я запропонував би його рішення, якби я про це знав.
Бен Еверард,

1

Шукаєте імплоду ?

$array = array('lastname', 'email', 'phone');

$comma_separated = implode(",", $array);

echo $comma_separated; // lastname,email,phone

Ні, оскільки мій масив складається з об’єктів, а не з рядків. І результатом повинен бути масив, а не імплодований рядок.
acme

0

Зараз я не можу перевірити це, але чи можете ви перевірити, що відбувається, коли у вас implode()такий масив? Слід викликати _toString .


Це робить. Підійде просто implode($array).
Гордон,

1
@Gordon: Це об'єднає всі рядки в одному, хоча, я думаю, OP хоче зберегти __toString()згенеровані рядки у відповідних елементах масиву.
Алікс Аксель

Правильно, я хочу, щоб масив все ще залишався цілим, і лише елементи в ньому лилися в рядки.
acme

@Alix О, розумію. Так. Тоді імплодія не спрацює.
Гордон,

1
@nikc: Ні, якщо створене __toString()містить ,.
Алікс Аксель

0

Alix Axel має найкращу відповідь. Ви також можете застосувати до масиву що-небудь, хоча за допомогою array_map, наприклад ...

//All your objects to string.
$a = array_map(function($o){return (string)$o;}, $a);
//All your objects to string with exclamation marks!!!
$a = array_map(function($o){return (string)$o."!!!";}, $a);

Насолоджуйтесь


-5

Чи є якась причина, чому ви не можете зробити наступне?

$a = array(
    (string) $objA,
    (string) $objB,
);

Так, тому що насправді я не знаю, скільки елементів у масиві. Приклад вище було просто зведено до двох елементів, щоб зробити його більш зрозумілим.
acme
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.