forked from a64f7bb4-7358-4778-9fbe-3b882c34cc1d/v1
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);
|
|
}
|
|
}
|