split string of emails into groups if string is longer than 50 emails
Is there an efficient way to split a string containing a list of email addresses into groups of say 50? Say I have a string that contains emails in a comma-separated format. Something like... email1@host.com,email2@host.com,email3@host.com and so on.
The most obvious way to do this would probably be an array, 开发者_Go百科but is there a way to do it with string functions? I have looked at substr and str_split and they don't quite seem to do the job.
It should be by far more efficient to search for the 50th occurrence of a comma and split the string after this. So find this Position. I think this http://www.php.net/manual/en/function.strpos.php#102336 should be a solution for that. Then split the string with substr and remove the comma at pos 1 of the new string.
Shortened PHP-Code to fit your needs:
<?php
function strnpos( $haystack, $needle, $nth, $offset = 0 ) {
// If needle is not a string, it is converted to an integer and applied as the ordinal value of a character.
if(!is_string($needle))
$needle = chr((int)$needle );
// Are the supplied values valid / reasonable?
$len = strlen( $needle );
if(1 > $nth || 0 === $len)
return false;
// $offset is incremented in the call to strpos, so make sure that the first
// call starts at the right position by initially decreasing $offset by $len.
$offset -= $len;
do {
$offset = strpos( $haystack, $needle, $offset + $len );
} while( --$nth && false !== $offset );
return $offset;
}
$emails_str = 'email1@host.com,email2@host.com,email3@host.com,...';
$pos = strnpos($emails_str, ',', 50, 0);
while($pos) {
// Do sth. with the group...
echo substr($emails_str, 0, $pos), PHP_EOL;
// Cut this part out of the string
$emails_str = substr($emails_str, $pos+1);
$pos = strnpos($emails_str, ',', 50, 0);
}
Yeah, find
$string="word_1, word_2, word_3";
$array=preg_split("/([,]{49}[,])+",$string);
Or you could use
A complete set of strn*pos functions that look for the nth occurrence of the needle in the haystack. I prefer this implementation of strnpos because it doesn't give visible warnings when supplied with a needle of length 0 (which is, admittedly, non-standard behavior). Based on a version I [originally posted on 05-MAR-2010]; this new version conforms more to the semantics of strpos.
<?php
/**
* This function implements all the strn*pos functions, which return the $nth occurrence of $needle
* in $haystack, or false if it doesn't exist / when illegal parameters have been supplied.
*
* @param string $haystack the string to search in.
* @param MIXED $needle the string or the ASCII value of the character to search for.
* @param integer $nth the number of the occurrence to look for.
* @param integer $offset the position in $haystack to start looking for $needle.
* @param bool $insensitive should the function be case insensitive?
* @param bool $reverse should the function work its way backwards in the haystack?
* @return MIXED integer either the position of the $nth occurrence of $needle in $haystack,
* or boolean false if it can't be found.
*/
function strnripos_generic( $haystack, $needle, $nth, $offset, $insensitive, $reverse )
{
// If needle is not a string, it is converted to an integer and applied as the ordinal value of a character.
if( ! is_string( $needle ) ) {
$needle = chr( (int) $needle );
}
// Are the supplied values valid / reasonable?
$len = strlen( $needle );
if( 1 > $nth || 0 === $len ) {
return false;
}
if( $insensitive ) {
$haystack = strtolower( $haystack );
$needle = strtolower( $needle );
}
if( $reverse ) {
$haystack = strrev( $haystack );
$needle = strrev( $needle );
}
// $offset is incremented in the call to strpos, so make sure that the first
// call starts at the right position by initially decreasing $offset by $len.
$offset -= $len;
do
{
$offset = strpos( $haystack, $needle, $offset + $len );
} while( --$nth && false !== $offset );
return false === $offset || ! $reverse ? $offset : strlen( $haystack ) - $offset;
}
/**
* @see strnripos_generic
*/
function strnpos( $haystack, $needle, $nth, $offset = 0 )
{
return strnripos_generic( $haystack, $needle, $nth, $offset, false, false );
}
/**
* @see strnripos_generic
*/
function strnipos( $haystack, $needle, $nth, $offset = 0 )
{
return strnripos_generic( $haystack, $needle, $nth, $offset, true, false );
}
/**
* @see strnripos_generic
*/
function strnrpos( $haystack, $needle, $nth, $offset = 0 )
{
return strnripos_generic( $haystack, $needle, $nth, $offset, false, true );
}
/**
* @see strnripos_generic
*/
function strnripos( $haystack, $needle, $nth, $offset = 0 )
{
return strnripos_generic( $haystack, $needle, $nth, $offset, true, true );
}
$haystack = 'Dit is een HoTtentotTentenTentenToonstellingTest!';
echo strnpos ( $haystack, 't', 5 ), ' === ', strnpos ( $haystack, 116, 5 ), PHP_EOL;
echo strnipos ( $haystack, 't', 5 ), ' === ', strnipos ( $haystack, 116, 5 ), PHP_EOL;
echo strnrpos ( $haystack, 't', 5 ), ' === ', strnrpos ( $haystack, 116, 5 ), PHP_EOL;
echo strnripos( $haystack, 't', 5 ), ' === ', strnripos( $haystack, 116, 5 ), PHP_EOL;
echo PHP_EOL;
echo strnpos ( $haystack, 'T', 5 ), ' === ', strnpos ( $haystack, 84, 5 ), PHP_EOL;
echo strnipos ( $haystack, 'T', 5 ), ' === ', strnipos ( $haystack, 84, 5 ), PHP_EOL;
echo strnrpos ( $haystack, 'T', 5 ), ' === ', strnrpos ( $haystack, 84, 5 ), PHP_EOL;
echo strnripos( $haystack, 'T', 5 ), ' === ', strnripos( $haystack, 84, 5 ), PHP_EOL;
?>
$emails = 'email1@host.com,email2@host.com,email3@host.com,...';
if( substr_count( $emails, '@' ) > 50 )
{
$groups = explode( ',', $emails );
$groups = array_chunk( $groups, 50 );
$emails = '';
foreach( $groups as $k => $group )
{
$group_data = implode( ', ', $group );
$emails .= "{$group_data}<hr/>";
}
}
echo $emails;
精彩评论