Loại bỏ các phần tử mảng trống


783

Một số phần tử trong mảng của tôi là các chuỗi trống dựa trên những gì người dùng đã gửi. Tôi cần phải loại bỏ những yếu tố đó. Tôi có cái này:

foreach($linksArray as $link)
{
    if($link == '')
    {
        unset($link);
    }
}
print_r($linksArray);

Nhưng nó không hoạt động. $linksArrayvẫn có các yếu tố trống rỗng. Tôi cũng đã thử làm nó với empty()chức năng, nhưng kết quả là như nhau.


1
Tôi nghĩ rằng điều đáng nói là mã ở trên không hoạt động vì unset (...) hoạt động trên biến được tạo bởi vòng lặp foreach, không phải là mảng ban đầu rõ ràng vẫn giữ nguyên như trước vòng lặp.
saveario 17/2/2017

if (! trống ($ link)) {echo $ link; } cái này hiệu quả với tôi
Shiplu 21/07/19

Bạn đang thay đổi một liên kết $ không được giới thiệu lại! sử dụng foreach ($ linksArray as $ key => $ link) unset (linksArray [$ key])
TD_Nijboer

Câu trả lời:


1548

Khi bạn đang xử lý một chuỗi các chuỗi, bạn có thể chỉ cần sử dụng array_filter(), điều này thuận tiện xử lý tất cả điều này cho bạn:

print_r(array_filter($linksArray));

Hãy nhớ rằng nếu không có cuộc gọi lại nào được cung cấp , tất cả các mục của mảng bằng FALSE(xem chuyển đổi sang boolean ) sẽ bị xóa. Vì vậy, nếu bạn cần bảo toàn các phần tử có nghĩa là chuỗi chính xác '0', bạn sẽ cần một cuộc gọi lại tùy chỉnh:

// PHP 7.4 and later
print_r(array_filter($linksArray, fn($value) => !is_null($value) && $value !== ''));

// PHP 5.3 and later
print_r(array_filter($linksArray, function($value) { return !is_null($value) && $value !== ''; }));

// PHP < 5.3
print_r(array_filter($linksArray, create_function('$value', 'return $value !== "";')));

16
array_filternên loại bỏ các yếu tố trống. Và nếu định nghĩa trống của PHP không hoàn toàn giống với định nghĩa của bạn, thì bạn có thể điền vào tùy chọn gọi lại bằng một hàm ẩn danh loại bỏ các phần tử không mong muốn. Rõ ràng bạn phải có php 5.3 trở lên để sử dụng các cuộc gọi lại ẩn danh. stackoverflow.com/questions/2412299/
trộm

76
xem ra mảng_filter không reindex chỉ mục mảng (một vấn đề có thể xảy ra trong việc sử dụng mảng quy trình trong câu lệnh). Vì vậy, bọc tất cả với hàm Array_values.
Michal - wereda-net

8
Câu trả lời là không chính xác, bởi vì nó sẽ loại bỏ falsecác yếu tố quá. ( Php.net/manual/en/function.array-filter.php )
pliashkou

5
@Deji bạn đã thử in mảng đó trước khi lọc chưa? Tôi nghĩ rằng thiết lập alần thứ hai chỉ đặt lại lần đầu tiên.
Cullub

5
@Cranio: đã được bao phủ bởi một bình luận khác. Nó không phải là không chính xác, nhưng có lẽ rộng hơn yêu cầu của bạn . Điều đó không có nghĩa là những người khác không thể thấy nó vẫn hữu ích; Rốt cuộc, nếu tất cả những gì bạn có là các chuỗi trong mảng của bạn, câu trả lời này sẽ chỉ loại bỏ các chuỗi trống.
Martijn Pieters

169

Bạn có thể sử dụng array_filterđể loại bỏ các yếu tố trống:

$emptyRemoved = array_filter($linksArray);

Nếu bạn có (int) 0trong mảng của mình, bạn có thể sử dụng như sau:

$emptyRemoved = remove_empty($linksArray);

function remove_empty($array) {
  return array_filter($array, '_remove_empty_internal');
}

function _remove_empty_internal($value) {
  return !empty($value) || $value === 0;
}

EDIT: Có thể các thành phần của bạn không trống mỗi se nhưng chứa một hoặc nhiều khoảng trắng ... Bạn có thể sử dụng các mục sau trước khi sử dụngarray_filter

$trimmedArray = array_map('trim', $linksArray);

10
Tôi vừa thêm nó vào câu trả lời được chấp nhận bởi BoltClock, bạn chỉ cần thực hiện mảng_filter ($ foo, 'strlen') để tránh vấn đề "0" và chỉ xóa những câu có độ dài bằng không.
AB Carroll

2
@nezZario: Giả sử bạn chỉ có scalarcác mục trong mảng của mình thì có. Nếu không, bạn không thể làm điều đó.
Andrew Moore

2
Sử dụng lambda cho php> = 5.3function remove_empty($array) { return array_filter($array, function($value){return !empty($value) || $value === 0;}); }
Viral

1
array_map()đã làm phép thuật cos tôi có không gian trong các mảng trống!
Thần đồng

126

Câu trả lời phổ biến nhất về chủ đề này là hoàn toàn TUYỆT VỜI.

Hãy xem xét tập lệnh PHP sau:

<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));

Tại sao lại thế này? Bởi vì một chuỗi chứa một ký tự '0' cũng đánh giá là boolean false, do đó, mặc dù đó không phải là một chuỗi rỗng, nó vẫn sẽ được lọc. Đó sẽ là một lỗi.

Truyền hàm strlen tích hợp làm hàm lọc sẽ hoạt động, bởi vì nó trả về một số nguyên khác không cho một chuỗi không trống và một số nguyên 0 cho một chuỗi trống. Các số nguyên khác không luôn luôn ước tính thành true khi được chuyển đổi thành boolean, trong khi các số nguyên bằng 0 luôn đánh giá thành false khi được chuyển đổi thành boolean.

Vì vậy, câu trả lời tuyệt đối, dứt khoát, chính xác là:

$arr = array_filter($arr, 'strlen');

3
Đã đồng ý. Đây phải là câu trả lời được chấp nhận, cho những người có mảng chứa chuỗi
mwieczorek

2
Nâng cao. Một câu trả lời tốt hơn so với nhiều câu hỏi khác, tuy nhiên, cần lưu ý rằng câu trả lời hiện được chấp nhận về mặt kỹ thuật không phải là không chính xác vì "thực sự" thực sự có ý nghĩa đặc biệt trong PHP. (Một số giá trị đủ điều kiện là "trống rỗng": 0, "", null)
rinogo

5
Họ không chính xác, đó là tất cả về bối cảnh. Trong một số trường hợp, việc bảo tồn giá trị 0 có thể quan trọng. Vì vậy, xin vui lòng, đừng nói rằng mọi người đều sai ngoại trừ bạn
Macr1408

6
Điều này sẽ phá vỡ nếu mảng chứa một mảng khác:strlen() expects parameter 1 to be string, array given
hpaknia

Bạn có thể nói rằng đây cũng có thể là một cách tiếp cận tốt (thay vì nói người khác không đúng) để đạt được hành động mong muốn của một người. Về cơ bản, không phải tất cả các trường hợp đều giống nhau. Mặc dù cách tiếp cận này phù hợp với trường hợp của tôi.
MR_AMDEV

102
$linksArray = array_filter($linksArray);

"Nếu không có cuộc gọi lại nào được cung cấp, tất cả các mục nhập của đầu vào bằng FALSE sẽ bị xóa." - http://php.net/manual/en/feft.array-filter.php


4
Tôi cũng đã thử điều này sau khi Google gặp sự cố. Thật không may, nó để lại trong các yếu tố trống cho tôi.
Sẽ

18
điều này cũng sẽ xóa '0'
OIS

2
@ Sẽ: bạn có chắc không? Nó cũng loại bỏ các chuỗi trống, tôi đã thử nghiệm thành công này. Có thể giá trị đầu vào của bạn chứa khoảng trắng và nên được cắt bớt trước. Theo quy tắc chuyển đổi boolean , chuỗi rỗng được ước tính là false và do đó bị loại bỏ bởi Array_filter.
acme

52
    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
    $myarray = array_filter($myarray);            //removes all null values

strlen cũng xóa sai :(
justnorris

42

Bạn chỉ có thể làm

array_filter($array)

mảng_filter: "Nếu không có cuộc gọi lại nào được cung cấp, tất cả các mục nhập của đầu vào bằng FALSE sẽ bị xóa." Điều này có nghĩa là các phần tử có giá trị NULL, 0, '0', '', FALSE, mảng () cũng sẽ bị xóa.

Tùy chọn khác là làm

array_diff($array, array(''))

sẽ loại bỏ các phần tử có giá trị NULL, '' và FALSE.

Hi vọng điêu nay co ich :)

CẬP NHẬT

Đây là một ví dụ.

$a = array(0, '0', NULL, FALSE, '', array());

var_dump(array_filter($a));
// array()

var_dump(array_diff($a, array(0))) // 0 / '0'
// array(NULL, FALSE, '', array());

var_dump(array_diff($a, array(NULL))) // NULL / FALSE / ''
// array(0, '0', array())

Tóm lại:

  • 0 hoặc '0' sẽ xóa 0 và '0'
  • NULL, FALSE hoặc '' sẽ xóa NULL, FALSE và ''

36
foreach($linksArray as $key => $link) 
{ 
    if($link === '') 
    { 
        unset($linksArray[$key]); 
    } 
} 
print_r($linksArray); 

4
Một giải pháp ngắn gọn, dễ đọc và an toàn mà không loại bỏ false0. Xem xét điều này đã được đăng cùng phút với câu trả lời được chấp nhận (không an toàn và không chính xác), tôi chỉ có thể giả sử 8 câu trả lời của bạn so với câu trả lời được chấp nhận là 649 cho câu trả lời sau là giải pháp một dòng.
rybo111

@ rybo111 - có thể, mặc dù sử dụng logic đó trong cuộc gọi lại array_filter()sẽ là cách tiếp cận sạch hơn foreach()vòng lặp
Mark Baker

Có lẽ nhanh hơn, nhưng giải pháp của bạn là dễ đọc nhất, đó là điều quan trọng. Đối với những người sử dụng giải pháp của bạn yêu cầu trim(), tôi muốn giới thiệuif(is_string($link) && trim($link) === '')
rybo111

33

Một lớp lót khác để loại bỏ các phần tử rỗng ("" chuỗi rỗng) khỏi mảng của bạn.

$array = array_filter($array, function($a) {return $a !== "";});

Lưu ý: Mã này cố tình giữ null, 0falsecác yếu tố.


Hoặc có thể bạn muốn cắt các phần tử mảng của mình trước:

$array = array_filter($array, function($a) {
    return trim($a) !== "";
});

Lưu ý: Mã này cũng loại bỏ nullfalsecác yếu tố.


3
Chính xác những gì tôi đã xem, và điều này cũng tương thích với các PHP cũ hơn , cảm ơn! ;-)
Stano

1
@JohnK Sai. Để làm điều này chính xác như whants dùng để gọi lại cần thiết, trừ khi bạn muốn loại bỏ alzo zero và giá trị falsey khác.
Cranio

Ồ ... điều này hoàn toàn đáng yêu. Nên là người được chấp nhận.
Henrik Petterson

20

Nói ngắn gọn:

Đây là mã đề xuất của tôi:

$myarray =  array_values(array_filter(array_map('trim', $myarray), 'strlen'));

Giải trình:

Tôi nghĩ rằng sử dụng array_filterlà tốt, nhưng không đủ, bởi vì các giá trị là như thế space\n, ... giữ trong mảng và điều này thường là xấu.

Vì vậy, tôi đề nghị bạn sử dụng hỗn hợp array_filterarray_map.

array_maplà để cắt xén, array_filterlà để loại bỏ các giá trị trống, strlenlà để giữ 0giá trị và array_valueslà để lập chỉ mục lại nếu bạn cần.

Mẫu:

$myarray = array("\r", "\n", "\r\n", "", " ", "0", "a");

// "\r", "\n", "\r\n", " ", "a"
$new1 = array_filter($myarray);

// "a"
$new2 = array_filter(array_map('trim', $myarray));

// "0", "a"
$new3 = array_filter(array_map('trim', $myarray), 'strlen');

// "0", "a" (reindex)
$new4 = array_values(array_filter(array_map('trim', $myarray), 'strlen'));

var_dump($new1, $new2, $new3, $new4);

Các kết quả:

array(5) {
  [0]=>
" string(1) "
  [1]=>
  string(1) "
"
  [2]=>
  string(2) "
"
  [4]=>
  string(1) " "
  [6]=>
  string(1) "a"
}
array(1) {
  [6]=>
  string(1) "a"
}
array(2) {
  [5]=>
  string(1) "0"
  [6]=>
  string(1) "a"
}
array(2) {
  [0]=>
  string(1) "0"
  [1]=>
  string(1) "a"
}

Bài kiểm tra trực tuyến:

http://phpio.net/s/5yg0


13

Nếu bạn đang làm việc với một mảng số và cần lập chỉ mục lại mảng sau khi loại bỏ các phần tử trống, hãy sử dụng hàm Array_values :

array_values(array_filter($array));

Xem thêm: mảng reindex PHP?


12

Câu trả lời được bình chọn nhiều nhất là sai hoặc ít nhất là không hoàn toàn đúng vì OP chỉ nói về chuỗi trống. Đây là một lời giải thích kỹ lưỡng:

Những gì hiện có sản phẩm nào có ý nghĩa?

Trước hết, chúng ta phải đồng ý về những gì có nghĩa là trống rỗng . Bạn có nghĩa là để lọc ra:

  1. các chuỗi trống chỉ ("")?
  2. Các giá trị sai hoàn toàn ? ( $element === false)
  3. các giá trị falsey ? (tức là 0, 0,0, "", "0", NULL, mảng () ...)
  4. tương đương với empty()chức năng của PHP ?

Làm thế nào để bạn lọc ra các giá trị

Để chỉ lọc các chuỗi trống :

$filtered = array_diff($originalArray, array(""));

Để chỉ lọc ra các giá trị sai nghiêm ngặt , bạn phải sử dụng chức năng gọi lại :

$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
    return $var === false;
}

Cuộc gọi lại cũng hữu ích cho bất kỳ sự kết hợp nào mà bạn muốn lọc ra các giá trị "falsey", ngoại trừ một số. (Ví dụ: lọc mọi nullfalse, v.v., chỉ để lại 0):

$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
    return ($var === 0 || $var === '0');
}

Trường hợp thứ ba và thứ tư là (cho mục đích cuối cùng của chúng tôi) tương đương và tất cả những gì bạn phải sử dụng là mặc định:

$filtered = array_filter($originalArray);

2
Nếu bạn muốn lấy ra nullfalse, nhưng để lại 0, bạn cũng có thể sử dụng strlenchức năng tích hợp của php làm cuộc gọi lại.
Cullub

10

Tôi đã phải làm điều này để giữ một giá trị mảng là (chuỗi) 0

$url = array_filter($data, function ($value) {
  return (!empty($value) || $value === 0 || $value==='0');
});


9

Đối với mảng đa chiều

$data = array_map('array_filter', $data);
$data = array_filter($data);

9
$out_array = array_filter($input_array, function($item) 
{ 
    return !empty($item['key_of_array_to_check_whether_it_is_empty']); 
}
);

9
function trim_array($Array)
{
    foreach ($Array as $value) {
        if(trim($value) === '') {
            $index = array_search($value, $Array);
            unset($Array[$index]);
        }
    }
    return $Array;
}

7

Tôi sử dụng đoạn script sau để loại bỏ các phần tử trống khỏi một mảng

for ($i=0; $i<$count($Array); $i++)
  {
    if (empty($Array[$i])) unset($Array[$i]);
  }

7

Chỉ muốn đóng góp một giải pháp thay thế cho các vòng lặp ... cũng giải quyết các khoảng trống trong khóa ...

Trong trường hợp của tôi, tôi muốn giữ các khóa mảng liên tiếp khi hoạt động hoàn tất (không chỉ là số lẻ, đó là những gì tôi đang nhìn chằm chằm. Thiết lập mã để chỉ tìm các khóa lẻ có vẻ mong manh đối với tôi và không thân thiện với tương lai.)

Tôi đang tìm kiếm một cái gì đó giống như thế này: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/

Sự kết hợp của Array_filter và Array_slice thực hiện thủ thuật.

$example = array_filter($example); $example = array_slice($example,0);

Không có ý tưởng về hiệu quả hoặc điểm chuẩn nhưng nó hoạt động.


Tôi nghĩ rằng Array_values ​​sẽ có kết quả tương tự như Array_slice. Điều đó có vẻ trực quan hơn về mặt đọc mã sau này và hiểu những gì nó đang làm.
arlomedia 11/03/2015

6
$my = ("0"=>" ","1"=>"5","2"=>"6","3"=>" ");   

foreach ($my as $key => $value) {
    if (is_null($value)) unset($my[$key]);
}

foreach ($my as $key => $value) {
    echo   $key . ':' . $value . '<br>';
} 

đầu ra

1: 5

2: 6



5

Chỉ một dòng: Cập nhật (nhờ @suther):

$array_without_empty_values = array_filter($array);

không cần tham số thứ hai của bạn: $ clean_array = Array_filter ($ Dirt_array);
suther

4

sử dụng array_filterhàm để loại bỏ các giá trị trống:

$linksArray = array_filter($linksArray);
print_r($linksArray);

Anh ta muốn xóa các chuỗi trống , không tương đương với các giá trị trống.
Cranio

4

Loại bỏ các phần tử mảng trống

function removeEmptyElements(&$element)
{
    if (is_array($element)) {
        if ($key = key($element)) {
            $element[$key] = array_filter($element);
        }

        if (count($element) != count($element, COUNT_RECURSIVE)) {
            $element = array_filter(current($element), __FUNCTION__);
        }

        return $element;
    } else {
        return empty($element) ? false : $element;
    }
}

$data = array(
    'horarios' => array(),
    'grupos' => array(
        '1A' => array(
            'Juan' => array(
                'calificaciones' => array(
                    'Matematicas' => 8,
                    'Español' => 5,
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => 20,
                    'febrero' => 10,
                    'marzo' => '',
                )
            ),
            'Damian' => array(
                'calificaciones' => array(
                    'Matematicas' => 10,
                    'Español' => '',
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => 20,
                    'febrero' => '',
                    'marzo' => 5,
                )
            ),
        ),
        '1B' => array(
            'Mariana' => array(
                'calificaciones' => array(
                    'Matematicas' => null,
                    'Español' => 7,
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => null,
                    'febrero' => 5,
                    'marzo' => 5,
                )
            ),
        ),
    )
);

$data = array_filter($data, 'removeEmptyElements');
var_dump($data);

Nó hoạt động!


3

Theo phương pháp của bạn, bạn có thể chỉ cần bắt các phần tử đó trong một mảng khác và sử dụng một phần tử như sau,

foreach($linksArray as $link){
   if(!empty($link)){
      $new_arr[] = $link
   }
}

print_r($new_arr);

1

thử cái này ** ** Ví dụ

$or = array(
        'PersonalInformation.first_name' => $this->request->data['User']['first_name'],
        'PersonalInformation.last_name' => $this->request->data['User']['last_name'],
        'PersonalInformation.primary_phone' => $this->request->data['User']['primary_phone'],
        'PersonalInformation.dob' => $this->request->data['User']['dob'],
        'User.email' => $this->request->data['User']['email'],
    );



 $or = array_filter($or);

    $condition = array(
        'User.role' => array('U', 'P'),
        'User.user_status' => array('active', 'lead', 'inactive'),
        'OR' => $or
    );

1
Cái này là cái gì? Có rất nhiều câu trả lời rất phù hợp khác. Bạn đang thêm gì ở đây?
Félix Gagnon-Grenier

kiểm tra url câu hỏi ở đây là gì !! / * xóa phần tử mảng trống * /
Ashish pathak

1

Tôi nghĩ rằng Array_walk phù hợp hơn nhiều ở đây

$linksArray = array('name', '        ', '  342', '0', 0.0, null, '', false);

array_walk($linksArray, function(&$v, $k) use (&$linksArray){
    $v = trim($v);
    if ($v == '')
        unset($linksArray[$k]);
});
print_r($linksArray);

Đầu ra:

Array
(
    [0] => name
    [2] => 342
    [3] => 0
    [4] => 0
)
  • Chúng tôi đảm bảo rằng các giá trị trống sẽ bị xóa ngay cả khi người dùng thêm nhiều hơn một khoảng trắng
  • Chúng tôi cũng cắt bớt các khoảng trống từ các giá trị hợp lệ

  • Cuối cùng, chỉ (null), (Boolean Sai) và ('') sẽ được coi là chuỗi rỗng

Đối với Falseviệc xóa nó là được, vì AFAIK người dùng không thể gửi các giá trị boolean.


0

Với những loại điều này, tốt hơn hết là nên nói rõ về những gì bạn muốn và không muốn.

Nó sẽ giúp anh chàng tiếp theo không bị bất ngờ trước hành vi array_filter()không có cuộc gọi lại. Ví dụ, tôi đã kết thúc câu hỏi này bởi vì tôi đã quên nếu array_filter()loại bỏ NULLhay không. Tôi đã lãng phí thời gian khi tôi có thể vừa sử dụng giải pháp dưới đây và có câu trả lời của mình.

Ngoài ra, logic là ngôn ngữ không theo ngôn ngữ theo nghĩa là mã có thể được sao chép sang ngôn ngữ khác mà không phải chịu tác động của hàm php như array_filterkhi không có cuộc gọi lại nào được thông qua.

Trong giải pháp của tôi, rõ ràng trong nháy mắt về những gì đang xảy ra. Xóa một điều kiện để giữ một cái gì đó hoặc thêm một điều kiện mới để lọc các giá trị bổ sung.

Bỏ qua việc sử dụng thực tế array_filter()vì tôi chỉ chuyển cho nó một cuộc gọi lại tùy chỉnh - bạn có thể tiếp tục và trích xuất nó ra chức năng của chính nó nếu bạn muốn. Tôi chỉ sử dụng nó như đường cho một foreachvòng lặp.

<?php

$xs = [0, 1, 2, 3, "0", "", false, null];

$xs = array_filter($xs, function($x) {
    if ($x === null) { return false; }
    if ($x === false) { return false; }
    if ($x === "") { return false; }
    if ($x === "0") { return false; }
    return true;
});

$xs = array_values($xs); // reindex array   

echo "<pre>";
var_export($xs);

Một lợi ích khác của phương pháp này là bạn có thể tách các biến vị ngữ lọc thành một hàm trừu tượng để lọc một giá trị duy nhất cho mỗi mảng và xây dựng thành một giải pháp tổng hợp.

Xem ví dụ này và các ý kiến ​​nội tuyến cho đầu ra.

<?php

/**
 * @param string $valueToFilter
 *
 * @return \Closure A function that expects a 1d array and returns an array
 *                  filtered of values matching $valueToFilter.
 */
function filterValue($valueToFilter)
{
    return function($xs) use ($valueToFilter) {
        return array_filter($xs, function($x) use ($valueToFilter) {
            return $x !== $valueToFilter;
        });
    };
}

// partially applied functions that each expect a 1d array of values
$filterNull = filterValue(null);
$filterFalse = filterValue(false);
$filterZeroString = filterValue("0");
$filterEmptyString = filterValue("");

$xs = [0, 1, 2, 3, null, false, "0", ""];

$xs = $filterNull($xs);        //=> [0, 1, 2, 3, false, "0", ""]
$xs = $filterFalse($xs);       //=> [0, 1, 2, 3, "0", ""]
$xs = $filterZeroString($xs);  //=> [0, 1, 2, 3, ""]
$xs = $filterEmptyString($xs); //=> [0, 1, 2, 3]

echo "<pre>";
var_export($xs); //=> [0, 1, 2, 3]

Bây giờ bạn có thể tự động tạo một hàm gọi là filterer()sử dụng pipe()sẽ áp dụng các hàm được áp dụng một phần này cho bạn.

<?php

/**
 * Supply between 1..n functions each with an arity of 1 (that is, accepts
 * one and only one argument). Versions prior to php 5.6 do not have the
 * variadic operator `...` and as such require the use of `func_get_args()` to
 * obtain the comma-delimited list of expressions provided via the argument
 * list on function call.
 *
 * Example - Call the function `pipe()` like:
 *
 *   pipe ($addOne, $multiplyByTwo);
 *
 * @return closure
 */
function pipe()
{
    $functions = func_get_args(); // an array of callable functions [$addOne, $multiplyByTwo]
    return function ($initialAccumulator) use ($functions) { // return a function with an arity of 1
        return array_reduce( // chain the supplied `$arg` value through each function in the list of functions
            $functions, // an array of functions to reduce over the supplied `$arg` value
            function ($accumulator, $currFn) { // the reducer (a reducing function)
                return $currFn($accumulator);
            },
            $initialAccumulator
        );
    };
}

/**
 * @param string $valueToFilter
 *
 * @return \Closure A function that expects a 1d array and returns an array
 *                  filtered of values matching $valueToFilter.
 */
function filterValue($valueToFilter)
{
    return function($xs) use ($valueToFilter) {
        return array_filter($xs, function($x) use ($valueToFilter) {
            return $x !== $valueToFilter;
        });
    };
}

$filterer = pipe(
    filterValue(null),
    filterValue(false),
    filterValue("0"),
    filterValue("")
);

$xs = [0, 1, 2, 3, null, false, "0", ""];
$xs = $filterer($xs);

echo "<pre>";
var_export($xs); //=> [0, 1, 2, 3]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.