Импланировать массив с помощью «,» и добавить «и» до последнего элемента

Этот массив содержит список элементов, я хочу превратить его в строку, но я не знаю, как сделать последний элемент с & / и перед ним вместо комы.

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))))));