Tôi có một mảng trông như thế này:
array(
'abc' => 0,
'foo-bcd' => 1,
'foo-def' => 1,
'foo-xyz' => 0,
// ...
)
Làm cách nào để chỉ lấy các phần tử bắt đầu bằng foo-
?
Tôi có một mảng trông như thế này:
array(
'abc' => 0,
'foo-bcd' => 1,
'foo-def' => 1,
'foo-xyz' => 0,
// ...
)
Làm cách nào để chỉ lấy các phần tử bắt đầu bằng foo-
?
Câu trả lời:
$arr_main_array = array('foo-test' => 123, 'other-test' => 456, 'foo-result' => 789);
foreach($arr_main_array as $key => $value){
$exp_key = explode('-', $key);
if($exp_key[0] == 'foo'){
$arr_result[] = $value;
}
}
if(isset($arr_result)){
print_r($arr_result);
}
Cách tiếp cận chức năng:
Chọn một array_filter_key
loại chức năng từ các nhận xét trong http://php.net/array_filter hoặc viết của riêng bạn. Sau đó, bạn có thể làm:
$array = array_filter_key($array, function($key) {
return strpos($key, 'foo-') === 0;
});
Cách tiếp cận theo thủ tục:
$only_foo = array();
foreach ($array as $key => $value) {
if (strpos($key, 'foo-') === 0) {
$only_foo[$key] = $value;
}
}
Cách tiếp cận thủ tục sử dụng các đối tượng:
$i = new ArrayIterator($array);
$only_foo = array();
while ($i->valid()) {
if (strpos($i->key(), 'foo-') === 0) {
$only_foo[$i->key()] = $i->current();
}
$i->next();
}
array_filter()
, bạn có thể sử dụng cờ này thay vì cung cấp một array_filter_key()
hàm tùy chỉnh .
Đây là cách tôi sẽ làm, mặc dù tôi không thể cho bạn một lời khuyên hiệu quả hơn trước khi hiểu bạn muốn làm gì với những giá trị bạn nhận được.
$search = "foo-";
$search_length = strlen($search);
foreach ($array as $key => $value) {
if (substr($key, 0, $search_length) == $search) {
...use the $value...
}
}
foreach ($array as $key => $value) { if (0 === strpos($key, 'foo-')) { ...use the $value... } }
Đơn giản là tôi đã sử dụng array_filter
hàm để đạt được giải pháp như sau
<?php
$input = array(
'abc' => 0,
'foo-bcd' => 1,
'foo-def' => 1,
'foo-xyz' => 0,
);
$filtered = array_filter($input, function ($key) {
return strpos($key, 'foo-') === 0;
}, ARRAY_FILTER_USE_KEY);
print_r($filtered);
Đầu ra
Array
(
[foo-bcd] => 1
[foo-def] => 1
[foo-xyz] => 0
)
Để kiểm tra trực tiếp https://3v4l.org/lJCse
foreach($arr as $key => $value)
{
if(preg_match('/^foo-/', $key))
{
// You can access $value or create a new array based off these values
}
}
Sửa đổi đối với phương pháp tiếp cận Chức năng của erisco ,
array_filter($signatureData[0]["foo-"], function($k) {
return strpos($k, 'foo-abc') === 0;
}, ARRAY_FILTER_USE_KEY);
điều này đã làm việc cho tôi.
Ngoài câu trả lời của @Suresh Velusamy ở trên (cần ít nhất PHP 5.6.0), bạn có thể sử dụng câu trả lời sau nếu bạn đang sử dụng phiên bản PHP trước:
<?php
$input = array(
'abc' => 0,
'foo-bcd' => 1,
'foo-def' => 1,
'foo-xyz' => 0,
);
$filtered = array_filter(array_keys($input), function($key) {
return strpos($key, 'foo-') === 0;
});
print_r($filtered);
/* Output:
Array
(
[1] => foo-bcd
[2] => foo-def
[3] => foo-xyz
)
// the numerical array keys are the position in the original array!
*/
// if you want your array newly numbered just add:
$filtered = array_values($filtered);
print_r($filtered);
/* Output:
Array
(
[0] => foo-bcd
[1] => foo-def
[2] => foo-xyz
)
*/
$key => $value
cặp ban đầu . Đó là tuyên bố trong đầu ra của câu trả lời này, nhưng vẫn chưa được đề cập một cách rõ ràng