v1/vendor/phootwork/lang/parts/ArrayConversionsPart.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);
}
}