104 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			104 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php declare(strict_types=1);
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This file is part of the Phootwork package.
							 | 
						||
| 
								 | 
							
								 * For the full copyright and license information, please view the LICENSE
							 | 
						||
| 
								 | 
							
								 * file that was distributed with this source code.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @license MIT License
							 | 
						||
| 
								 | 
							
								 * @copyright Thomas Gossmann
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								namespace phootwork\lang\parts;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use InvalidArgumentException;
							 | 
						||
| 
								 | 
							
								use phootwork\lang\ArrayObject;
							 | 
						||
| 
								 | 
							
								use phootwork\lang\Text;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Text methods for array/ArrayObject conversions
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @author Thomas Gossmann
							 | 
						||
| 
								 | 
							
								 * @author Cristiano Cinotti
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								trait ArrayConversionsPart {
							 | 
						||
| 
								 | 
							
									abstract protected function getString(): string;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Splits the string by string
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @param string $delimiter The boundary string.
							 | 
						||
| 
								 | 
							
									 * @param int $limit
							 | 
						||
| 
								 | 
							
									 * 		If limit is set and positive, the returned array will contain a maximum of
							 | 
						||
| 
								 | 
							
									 * 		limit elements with the last element containing the rest of string.
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * 		If the limit parameter is negative, all components except the last
							 | 
						||
| 
								 | 
							
									 * 		-limit are returned.
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * 		If the limit parameter is zero, then this is treated as 1.
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @throws InvalidArgumentException If the delimiter is an empty string.
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @return ArrayObject
							 | 
						||
| 
								 | 
							
									 * 		Returns an array of strings created by splitting the string parameter on boundaries
							 | 
						||
| 
								 | 
							
									 * 		formed by the delimiter.
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 *        If delimiter contains a value that is not contained in string and a negative limit is used,
							 | 
						||
| 
								 | 
							
									 *        then an empty array will be returned, otherwise an array containing string will be returned.
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function split(string $delimiter, int $limit = PHP_INT_MAX): ArrayObject {
							 | 
						||
| 
								 | 
							
										if ('' === $delimiter) {
							 | 
						||
| 
								 | 
							
											throw new InvalidArgumentException("The delimiter can't be an empty string");
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return new ArrayObject(explode($delimiter, $this->getString(), $limit));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Join array elements with a string
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @param array       $pieces   The array of strings to join.
							 | 
						||
| 
								 | 
							
									 * @param string      $glue     Defaults to an empty string.
							 | 
						||
| 
								 | 
							
									 * @param string|null $encoding the desired encoding
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @return Text
							 | 
						||
| 
								 | 
							
									 *        Returns a string containing a string representation of all the array elements in the
							 | 
						||
| 
								 | 
							
									 *        same order, with the glue string between each element.
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @psalm-suppress MixedArgumentTypeCoercion
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public static function join(array $pieces, string $glue = '', ?string $encoding = null): Text {
							 | 
						||
| 
								 | 
							
										array_map(
							 | 
						||
| 
								 | 
							
											function (mixed $element): void {
							 | 
						||
| 
								 | 
							
												if (!($element === null || is_scalar($element) || $element instanceof \Stringable)) {
							 | 
						||
| 
								 | 
							
													throw new \TypeError('Can join elements only if scalar, null or \\Stringable');
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											},
							 | 
						||
| 
								 | 
							
											$pieces
							 | 
						||
| 
								 | 
							
										);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return new Text(implode($glue, $pieces), $encoding);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Convert the string to an array
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @param int $splitLength Maximum length of the chunk.
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @throws InvalidArgumentException If splitLength is less than 1.
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @return ArrayObject
							 | 
						||
| 
								 | 
							
									 * 		If the optional splitLength parameter is specified, the returned array will be
							 | 
						||
| 
								 | 
							
									 * 		broken down into chunks with each being splitLength in length, otherwise each chunk
							 | 
						||
| 
								 | 
							
									 * 		will be one character in length.
							 | 
						||
| 
								 | 
							
									 *      If the split_length length exceeds the length of string, the entire string is returned
							 | 
						||
| 
								 | 
							
									 *      as the first (and only) array element.
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function chunk(int $splitLength = 1): ArrayObject {
							 | 
						||
| 
								 | 
							
										if (false === $array = str_split($this->getString(), $splitLength)) {
							 | 
						||
| 
								 | 
							
											throw new InvalidArgumentException('The chunk length has to be positive');
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return new ArrayObject($array);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |