Этот массив содержит список элементов, я хочу превратить его в строку, но я не знаю, как сделать последний элемент с & / и перед ним вместо комы.
1 => coke 2=> sprite 3=> fanta
должен стать
coke, sprite and fanta
Это регулярная функция implode:
$listString = implode(', ',$listArrau );
Что это простой способ сделать это?
Лонг-лайнер, который работает с любым количеством элементов:
echo join(' and ', array_filter(array_merge(array(join(', ', array_slice($array, 0, -1))), array_slice($array, -1)), 'strlen'));
Или, если вы действительно предпочитаете многословность:
$last = array_slice($array, -1); $first = join(', ', array_slice($array, 0, -1)); $both = array_filter(array_merge(array($first), $last), 'strlen'); echo join(' and ', $both);
Дело в том, что эта нарезка, слияние, фильтрация и объединение обрабатывают все случаи, включая 0, 1 и 2, правильно, без дополнительных if..else
утверждений. И это, случается, складывается в однострочный.
Я не уверен, что один лайнер – самое изящное решение этой проблемы.
Я написал это некоторое время назад и отложил его по мере необходимости:
/** * Join a string with a natural language conjunction at the end. * https://gist.github.com/angry-dan/e01b8712d6538510dd9c */ function natural_language_join(array $list, $conjunction = 'and') { $last = array_pop($list); if ($list) { return implode(', ', $list) . ' ' . $conjunction . ' ' . $last; } return $last; }
Вам не нужно использовать «и» в качестве вашей строки соединения, она эффективна и работает с чем угодно: от 0 до неограниченного количества элементов:
// null var_dump(natural_language_join(array())); // string 'one' var_dump(natural_language_join(array('one'))); // string 'one and two' var_dump(natural_language_join(array('one', 'two'))); // string 'one, two and three' var_dump(natural_language_join(array('one', 'two', 'three'))); // string 'one, two, three or four' var_dump(natural_language_join(array('one', 'two', 'three', 'four'), 'or'));
Вы можете поместить последний элемент, а затем присоединить его к тексту:
$yourArray = ('a', 'b', 'c'); $lastItem = array_pop($yourArray); // c $text = implode(', ', $yourArray); // a, b $text .= ' and '.$lastItem; // a, b and c
Попробуй это:
$str = array_pop($array); if ($array) $str = implode(', ', $array)." and ".$str;
Еще одно возможное короткое решение:
$values = array('coke', 'sprite', 'fanta'); $values[] = implode(' and ', array_splice($values, -2)); print implode(', ', $values); // "coke, sprite and fanta"
Он отлично работает с любым количеством значений.
Я знаю, что им нужно поздно ответить, но, конечно, это лучший способ сделать это?
$list = array('breakfast', 'lunch', 'dinner'); $list[count($list)-1] = "and " . $list[count($list)-1]; echo implode(', ', $list);
попробуй это
$arr = Array("coke","sprite","fanta"); $str = ""; $lenArr = sizeof($arr); for($i=0; $i<$lenArr; $i++) { if($i==0) $str .= $arr[$i]; else if($i==($lenArr-1)) $str .= " and ".$arr[$i]; else $str .= " , ".$arr[$i]; } print_r($str);
Попробуй это,
<?php $listArray = array("coke","sprite","fanta"); foreach($listArray as $key => $value) { if(count($listArray)-1 == $key) echo "and " . $value; else if(count($listArray)-2 == $key) echo $value . " "; else echo $value . ", "; } ?>
Я просто закодировал это на основе предложений на этой странице. Я оставил в своем псевдокоде комментарии в том случае, если кому-то это понадобилось. Мой код отличается от других здесь, поскольку он обрабатывает различные размеры массивов по-разному и использует нотацию в Оксфорде для списков из трех или более.
/** * Create a comma separated list of items using the Oxford comma notation. A * single item returns just that item. 2 array elements returns the items * separated by "and". 3 or more items return the comma separated list. * * @param array $items Array of strings to list * @return string List of items joined by comma using Oxford comma notation */ function _createOxfordCommaList($items) { if (count($items) == 1) { // return the single name return array_pop($items); } elseif (count($items) == 2) { // return array joined with "and" return implode(" and ", $items); } else { // pull of the last item $last = array_pop($items); // join remaining list with commas $list = implode(", ", $items); // add the last item back using ", and" $list .= ", and " . $last; return $list; } }
На данный момент это довольно старо, но я полагал, что не может помешать добавить мое решение в кучу. Это немного больше кода, чем другие решения, но я в порядке.
Я хотел кое-что с некоторой гибкостью, поэтому я создал метод утилиты, который позволяет установить, какой должен быть конечный разделитель (так, например, вы могли бы использовать амперсанд) и использовать или не использовать запятую Оксфорда. Он также правильно обрабатывает списки с 0, 1 и 2 пунктами (что-то немало ответов здесь не делает)
$androidVersions = ['Donut', 'Eclair', 'Froyo', 'Gingerbread', 'Honeycomb', 'Ice Cream Sandwich', 'Jellybean', 'Kit Kat', 'Lollipop', 'Marshmallow']; echo joinListWithFinalSeparator(array_slice($androidVersions, 0, 1)); // Donut echo joinListWithFinalSeparator(array_slice($androidVersions, 0, 2)); // Donut and Eclair echo joinListWithFinalSeparator($androidVersions); // Donut, Eclair, Froyo, Gingerbread, Honeycomb, Ice Cream Sandwich, Jellybean, Kit Kat, Lollipop, and Marshmallow echo joinListWithFinalSeparator($androidVersions, '&', false); // Donut, Eclair, Froyo, Gingerbread, Honeycomb, Ice Cream Sandwich, Jellybean, Kit Kat, Lollipop & Marshmallow function joinListWithFinalSeparator(array $arr, $lastSeparator = 'and', $oxfordComma = true) { if (count($arr) > 1) { return sprintf( '%s%s %s %s', implode(', ', array_slice($arr, 0, -1)), $oxfordComma && count($arr) > 2 ? ',':'', $lastSeparator ?: '', array_pop($arr) ); } // not a fan of this, but it's the simplest way to return a string from an array of 0-1 items without warnings return implode('', $arr); }
Хорошо, так что это становится довольно старым, но я должен сказать, что большинство ответов очень неэффективно с множественными слияниями модулей или массивов и т. Д., Все намного сложнее, чем необходимое ИМО.
Почему не просто:
implode(',', array_slice($array, 0, -1)) . ' and ' . array_slice($array, -1)[0]
Это быстрее, чем решение deceze, и работает с огромными массивами (элементы 1M +). Единственным недостатком обоих решений является плохое взаимодействие с числом 0 в массивах менее трех элементов из-за использования array_filter.
echo implode(' and ', array_filter(array_reverse(array_merge(array(array_pop($array)), array(implode(', ',$array))))));