|
|
array_slice (PHP 4, PHP 5) array_slice -- Выбрать срез массива Описаниеarray array_slice ( array array, int offset [, int length [, bool preserve_keys]] )
array_slice() возвращает последовательность
элементов массива array, определённую параметрами
offset и length.
Если параметр offset положителен, последовательность
начнётся на расстоянии offset от начала array. Если
offset отрицателен, последовательность
начнётся на расстоянии offset от конца array.
Если в эту функцию передан положительный параметр length,
последовательность будет включать length элементов.
Если в эту функцию передан отрицательный параметр length,
в последовательность войдут все элементы исходного массива, начиная с позиции offset
и заканчивая позицией, отстоящей на length элементов от конца array.
Если этот параметр будет опущен, в последовательность войдут все элементы
исходного массива array, начиная с позиции offset.
Обратите внимание, что array_slice() сбрасывает ключи массива.
Начиная с PHP 5.0.2 вы можете переопределить это поведение, установив параметр
preserve_keys в TRUE.
Пример 1. Пример использования array_slice() |
<?php
$input = array("a", "b", "c", "d", "e");
$output = array_slice($input, 2); $output = array_slice($input, -2, 1); $output = array_slice($input, 0, 3); print_r(array_slice($input, 2, -1));
print_r(array_slice($input, 2, -1, true));
?>
|
Вышеприведённый пример выведет:
Array
(
[0] => c
[1] => d
)
Array
(
[2] => c
[3] => d
) |
|
См. также array_splice() и
unset().
slimjackson at gmail dot com
29-Oct-2007 11:06
Re: 'cpa at NOSPAM dot conceptivator dot com' and 'gportlock at gembiz dot co dot uk'
limitText can be further simplified by adding a limit parameter to the explode function - eliminating the need for the use of array_slice entirely. Note that this only works for extracting the first n words of the string, and not the last.
Also, you've mistakenly used array_splice instead of array_slice in your functions.
<?php
function limitText( $text, $wordCount )
{
$wordArray = explode(" ", $text, $wordCount);
return implode( " ", $wordArray );
}
?>
aexchecker at yahoo dot com
04-Oct-2007 08:39
<?php
function array_insert($source, $destination, $offset = NULL, $length = NULL) {
if (!is_array($source) || empty($source)) {
if (is_array($destination) && !empty($destination)) {
return $destination;
}
return array();
}
if (is_null($offset)) {
return array_merge($destination, $source);
}
$offset = var2int($offset);
if (is_null($length)) {
if ($offset === 0) {
return array_merge($source, array_slice($destination, 1));
}
if ($offset === -1) {
return array_merge(array_slice($destination, 0, -1), $source);
}
return array_merge(
array_slice($destination, 0, $offset),
$source,
array_slice($destination, ++$offset)
);
}
if ($offset === 0) {
return array_merge($source, array_slice($destination, $length));
}
$destination_count = count($destination);
$length = var2int($length);
if ($offset > 0) {
if ($destination_count - $offset < 1) {
return array_merge($destination, $source);
}
} else{
if (($t = $destination_count + $offset) < 1) {
return array_merge($source, $destination);
}
$offset = $t;
}
if ($length > 0) {
$length+= $offset;
} elseif ($length < 0 && !($length * -1 < $destination_count)) {
return $source;
} else {
$length = $offset;
}
return array_merge(
array_slice($destination, 0, $offset),
$source,
array_slice($destination, $length)
);
}
?>
phpnotasp at gmail dot com
16-Jul-2007 02:42
It should be noted that this function does NOT modify the original array. So if you need to array_pop() or array_shift() without modifying the original array, you can use array_slice().
<?php
$input = array('a', 'b', 'c');
$output = array_slice($input, 1);
print_r($output);
print_r($input);
?>
sean at getclicky dot com
19-Jun-2007 12:54
People... let's keep things simple here. :) Some of the functions to mimic >5.0.2 behavior (preserving keys) are ridiculously complicated. Look how simple it can be:
<?php
function atrim( $a, $num ) {
while( sizeof( $a ) > $num ) array_pop( $a );
return $a;
}
?>
cpa at NOSPAM dot conceptivator dot com
07-Jun-2007 05:15
'gportlock at gembiz dot co dot uk' has an error in his limitText function. It simply takes a text string, then cuts off the first X words and returns the rest of the string. I believe the intended use is to return only the first X words and cut off the rest.
The correct version should be (notice the inserted 0 offset):
<?php
function limitText( $text, $wordCount )
{
$wordArray = explode(" ", $text);
array_splice($wordArray, 0, $wordCount);
return implode( " ", $wordArray );
}
?>
gportlock at gembiz dot co dot uk
24-May-2007 07:29
This function returns a text string that is limited by the word count. This funtion is particularly useful for paid advertising where you pay by the word.
function limitText( $text, $wordCount ){
$wordArray = explode(" ", $text);
array_splice($wordArray, $wordCount);
return implode( " ", $wordArray );
}
bc at bnc-automatisering dot nl
15-Mar-2007 04:41
first at all, ur php version check does not work correctly.
version 4.3.10 (4310 > 520)
Second, $a is not initialized.
Third, to let the function work the same as slice (offset) it should be:
function narray_slice($array, $offset, $length){
$a = 0;
foreach ($array as $key => $value) {
if (($a >= $offset) && ($a - $offset < $length))
$output_array[$key] = $value;
$a++;
}
return $output_array;
}
14-Mar-2007 09:09
I noticed that some other people made supportive functions for maintaining numeric keys for PHP versions less than 5.0.2. So here is my version of it.
<?php
function narray_slice($array, $offset, $length) {
if (str_replace('.', '', PHP_VERSION) >= 502)
return array_slice($array, $offset, $length, true);
foreach ($array as $key => $value) {
if ($a >= $offset && $a - $offset <= $length)
$output_array[$key] = $value;
$a++;
}
return $output_array;
}
?>
aflavio at gmail dot com
01-Mar-2007 01:43
/**
* Remove a value from a array
* @param string $val
* @param array $arr
* @return array $array_remval
*/
function array_remval($val, &$arr)
{
$array_remval = $arr;
for($x=0;$x<count($array_remval);$x++)
{
$i=array_search($val,$array_remval);
if (is_numeric($i)) {
$array_temp = array_slice($array_remval, 0, $i );
$array_temp2 = array_slice($array_remval, $i+1, count($array_remval)-1 );
$array_remval = array_merge($array_temp, $array_temp2);
}
}
return $array_remval;
}
$stack=Array('apple','banana','pear','apple', 'cherry', 'apple');
array_remval("apple", $stack);
//output: Array('banana','pear', 'cherry')
Apware
15-Feb-2007 04:34
A simple test of this function:
<?php
print_r(array_slice(array('a','b','c','d'), 0, 3)); print_r(array_slice(array('a','b','c','d'), 0, 10)); print_r(array_slice(array(), 0, 10)); ?>
19-Dec-2006 09:10
The version check on "ps at b1g dot de" function fails on my copy of PHP. My Version of PHP is "4.3.10-18", and it ends up checking 4310 <=> 502.
Since we are looking for a version over 4.1.0, we cas use version_compare.
<?php
if(function_exists('version_compare') and version_compare(PHP_VERSION, '5.0.2') >= 0) {
return array_slice($array, $offset, $length, true);
}
?>
ludvig ericson at http://toxik.a12.se/
05-Nov-2006 03:49
This function can also be used for pure laziness,
<?php
$myVar = end(array_slice(anotherFunction(), 0, 1));
?>
Imagine that anotherFunction() returns, say, three indexes, and you are sure you only want the Nth index, you could use this as a poor man's way of getting by the fact that PHP can't do this:
<?php
$myVar = (anotherFunction())[1];
?>
Which is sad.
ps at b1g dot de
03-Nov-2006 02:44
The following function is the same as array_slice with preserve_keys=true, but it works with PHP versions < 5.0.2.
When PHP >= 5.0.2 is available, the function uses the faster PHP-own array_slice-function with preserve_keys=true, otherwise it uses its own implementation.
<?php
function array_slice_preserve_keys($array, $offset, $length = null)
{
if((int)str_replace('.', '', phpversion()) >= 502)
return(array_slice($array, $offset, $length, true));
$result = array();
$i = 0;
if($offset < 0)
$offset = count($array) + $offset;
if($length > 0)
$endOffset = $offset + $length;
else if($length < 0)
$endOffset = count($array) + $length;
else
$endOffset = count($array);
foreach($array as $key=>$value)
{
if($i >= $offset && $i < $endOffset)
$result[$key] = $value;
$i++;
}
return($result);
}
?>
Good for backwards compatibility I hope somebody might find this useful.
david at bagnara dot org
18-Oct-2006 08:42
I was trying to pass an argument list through the constructors. I tried various things such as func_get_args(). My conclusion is to pass the args to the constructor as an array. Each constructor can remove the fields it wants and pass the array on.
Using the following prototype, each child class can have any number of parameters added to the beginning of the class constructor and the rest passed onto the parent.
If the default value is desired for an argument, just pass NULL.
This could possibly be better done with array_shift or the like.
<?php
class aChild extends aParent
{
public
$a, $b, $c;
function __construct( $args = array() )
{
$default = array( "a-def", "b-def", "c-def" ) ;
foreach( $args as $key=>$val )
{
if( !isset( $default[$key] ) )
{
break;
}
if( isset( $val ) )
{
$default[$key] = $val ;
}
}
list( $this->a, $this->b, $this->c ) = $default ;
$args = array_slice( $args, count( $default ) ) ;
parent::__construct( $args ) ;
}
}
$x = new aChild( array( "aChild a", NULL, "aChild c", NULL, "aParent second", "aParent third" ) ) ;
?>
DRB
24-Aug-2006 01:08
In response to the problem mentioned in the previous post (no name 06-May-2006 12:21) the following is a working solution:
$myarray = array_slice($myarray, 1, count($myarray), true);
It is too bad that the "preserve_keys" option is not available for the array_shift and array_pop functions as this would be somewhat simpler.
06-May-2006 12:21
If you specify the fourth argument (to not reassign the keys), then there appears to be no way to get the function to return all values to the end of the array. Assigning -0 or NULL or just putting two commas in a row won't return any results.
taylorbarstow at the google mail service
07-Apr-2006 02:01
Array slice function that works with associative arrays (keys):
function array_slice_assoc($array,$keys) {
return array_intersect_key($array,array_flip($keys));
}
andreasblixt (at) msn (dot) com
06-Sep-2005 09:53
<?php
function array_insert($src, $dest, $pos) {
if (!is_array($src) || !is_array($dest) || $pos <= 0) return FALSE;
return array_merge(array_slice($dest, 0, $pos), $src, array_slice($dest, $pos));
}
?>
ssb45 at cornell dot edu
28-Jul-2005 07:20
In reply to jenny at jennys dot info:
Here is a much easier way to find the $offset of a $key in an $array:
$offset = array_search($key, array_keys($array));
fanfatal at fanfatal dot pl
08-Jul-2005 03:09
Hmm ... i wrote an usefull function whitch is such like strpos but it works on arrays ;]
<?php
function array_pos($haystack, $needle) {
$size = count($needle);
$sizeh = count($haystack);
if($size > $sizeh) return false;
$scale = $sizeh - $size + 1;
for($i = 0; $i < $scale; $i++)
if($needle === array_slice($haystack, $i, $size))
return $i;
return false;
}
$a = array('aa','bb','cc','dd','ee');
$b = array('cc','dd');
$pos = array_pos($a, $b);
?>
Greatings ;-)
...
david dot tulloh at infaze dot com dot au
23-Jun-2005 06:26
Nice one liner to extract a column from a 2D array.
It works by using array_slice on every row, through array_map.
<?php
$test_subject[] = array("a", "b", "c");
$test_subject[] = array("d", "e", "f");
$column=1;
$result = array_map('array_slice', $test_subject,
array_fill(0, count($test_subject), $column),
array_fill(0, count($test_subject), 1)
);
result == array ( array("b"), array("e") );
?>
liz at matrixmailing dot com
06-Jun-2005 02:16
For those with PHP < 5.0.2, and have a number as your array key, to avoid having the key reset with array_slice, add a blank character to the beginning or end of the key.
<?
$array[" ".$key] = $value;
?>
bishop
08-Dec-2004 01:58
Sometimes you need to pick certain non-integer and/or non-sequential keys out of an array. Consider using the array_pick() implementation below to pull specific keys, in a specific order, out of a source array:
<?php
$a = array ('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
$b = array_pick($a, array ('d', 'b'));
function &array_pick(&$array, $keys)
{
if (! is_array($array)) {
trigger_error('First parameter must be an array', E_USER_ERROR);
return false;
}
if (! (is_array($keys) || is_scalar($keys))) {
trigger_error('Second parameter must be an array of keys or a scalar key', E_USER_ERROR);
return false;
}
if (is_array($keys)) {
} else if (is_scalar($keys)) {
$keys = array ($keys);
}
$resultArray = array ();
foreach ($keys as $key) {
if (is_scalar($key)) {
if (array_key_exists($key, $array)) {
$resultArray[$key] = $array[$key];
unset($array[$key]);
}
} else {
trigger_error('Supplied key is not scalar', E_USER_ERROR);
return false;
}
}
return $resultArray;
}
?>
pies at sputnik dot pl
17-Sep-2004 09:29
My shot at Dams's array_slice_key() implementation:
function array_slice_key($array, $offset, $len=-1){
if (!is_array($array))
return FALSE;
$length = $len >= 0? $len: count($array);
$keys = array_slice(array_keys($array), $offset, $length);
foreach($keys as $key) {
$return[$key] = $array[$key];
}
return $return;
}
Samuele at norsam dot org
05-Apr-2004 09:44
Note that if $offset+$length>count($array) then resulting array will NOT be filled with empty elements at his end, so it is not sure that it will have exactly $length elements. Example:
<?php
$a=Array(7,32,11,24,65); $b=array_slice($a,2,4); print_r($b);
?>
will return a 3-elements array:
Array
(
[0] => 11
[1] => 24
[2] => 65
)
23-Feb-2004 02:47
Use unset() to delete a associative array.
Ex:
<?php
$item['chaise'] = array ('qty' => 1,
'desc' => 'Chaise bercante 10"',
'avail' => 10);
$item['divan'] = array ('qty' => 1,
'desc' => 'Divan brun laitte"',
'avail' => 10);
if (isset($item['chaise'])) {
++$item['chaise']['qty'];
}
unset($item['divan']);
foreach ($item as $s) {
echo "<br />Commande " . $s['qty'] . " " . $s['desc'];
}
?>
jenny at jennys dot info
21-Feb-2004 10:12
Here's a function which returns the array offset based on the array key. This is useful if you'd like to use array_slice to get all keys/values after key "foo".
<?
function array_offset($array, $offset_key) {
$offset = 0;
foreach($array as $key=>$val) {
if($key == $offset_key)
return $offset;
$offset++;
}
return -1;
}
$array = array('foo'=>'foo', 'bar'=>'bar', 'bash'=>'bash', 'quux'=>'quux');
print_r($array);
// Prints the following:
// Array
// (
// [foo] => foo
// [bar] => bar
// [bash] => bash
// [quux] => quux
// )
$offset = array_offset($array,'bar');
// $offset now contains '1'
$new = array_slice($array,$offset+1);
print_r($new);
// Prints the following:
// Array
// (
// [bash] => bash
// [quux] => quux
// )
?>
webmaster_nospam at wavesport dot com
12-Nov-2002 04:48
This function may surprise you if you use arbitrary numeric values for keys, i.e.
<?php
$ar = array('a'=>'apple', 'b'=>'banana', '42'=>'pear', 'd'=>'orange');
print_r($ar);
$new_ar = array_slice($ar, 0, 3);
print_r($new_ar);
?>
The value 'pear' has had its key reassigned from '42' to '0'.
When $ar is initially created the string '42' is automatically type-converted by array() into an integer. array_slice() and array_splice() reassociate string keys from the passed array to their values in the returned array but numeric keys are reindexed starting with 0.
t dot oddy at ic dot ac dot uk
25-Apr-2002 06:47
[Editor's Note:
It is easier to do the same thing using array_values()
]
array_slice() can be used to "re-index" an array to start from key 0. For example, unpack creates an array with keys starting from 1;
<?php
var_dump(unpack("C*","AB"));
?>
produces
<?php
array(2) {
[1]=>
int(65)
[2]=>
int(66)
}
?>
and
<?php
var_dump(array_slice(unpack("C*","AB"),0));
?>
give you
<?php
array(2) {
[0]=>
int(65)
[1]=>
int(66)
}
?>
developer at i-space dot org
03-Feb-2002 08:22
remember that array_slice returns an array with the current element. you must use array_slice($array, $index+1) if you want to get the next elements.
richardgere at jippii dot fi
27-Jan-2002 09:14
The same thing, written by a maladroit :)
<?php
function array_slice2( $array, $offset, $length = 0 )
{
if( $offset < 0 )
$offset = sizeof( $array ) + $offset;
$length = ( !$length ? sizeof( $array ) : ( $length < 0 ? sizeof( $array ) - $length : $length + $offset ) );
for( $i = $offset; $i < $length; $i++ )
$tmp[] = $array[$i];
return $tmp;
}
?>
dams at php dot net
15-Dec-2001 07:09
Here is a version of Array_slice which takes into account keys.
That may be a suggestion for future developpement.
<?php
function array_slice_key($array, $offset){
if (!is_array($array))
return FALSE;
if (func_num_args() == 3){
$length = func_get_arg(2);
$length = max(0,intval($length));
} else {
$length = count($array);
}
$i = 0;
$return = array();
$keys = array_slice(array_keys($array), $offset, $length);
foreach( $keys as $key){
$return[$key] = $array[$key];
}
return $return;
}
?>
|