2010-01-20 75 views
5

tôi cần phải chuyển đổi chuỗi có dạngLàm thế nào để tìm thấy tất cả các chuỗi con của một chuỗi trong PHP

"a b c" 

vào mảng có dạng

Array 
(
    [0] => a 
    [1] => a b 
    [2] => a b c 
    [3] => b 
    [4] => b c 
    [5] => c 
) 

Liệu PHP cung cấp một chức năng có nguồn gốc để chuyển đổi chuỗi thành tất cả các chất nền? Nếu không, con đường của kháng chiến ít nhất để nhận được tất cả các chất nền là gì? Có cách nào đơn giản để có thể phát nổ() chuỗi, và sử dụng một mảng op để tạo ra tất cả hoán vị [thứ tự]?

Chúc mừng!

Trả lời

13

Sử dụng trong php-mảng-là-the-ống-băng-of-the-vũ trụ cách: P

function get_all_substrings($input, $delim = '') { 
    $arr = explode($delim, $input); 
    $out = array(); 
    for ($i = 0; $i < count($arr); $i++) { 
     for ($j = $i; $j < count($arr); $j++) { 
      $out[] = implode($delim, array_slice($arr, $i, $j - $i + 1)); 
     }  
    } 
    return $out; 
} 

$subs = get_all_substrings("a b c", " "); 
print_r($subs); 
+0

Cảm ơn - chính xác những gì tôi đang tìm kiếm! –

+1

Ngoài ra, +1 cho nhận xét dải băng/ống dẫn. Đúng vậy. –

1

Đường dẫn không phải là hoán vị. explode() chuỗi, sau đó sử dụng hai vòng lồng nhau cùng với array_slice() để có được các yếu tố có liên quan.

7
<?php 
function get_all_substrings($input){ 
    $subs = array(); 
    $length = strlen($input); 
    for($i=0; $i<$length; $i++){ 
     for($j=$i; $j<$length; $j++){ 
      $subs[] = substr($input, $i, $j);    
     } 
    } 
    return $subs; 
} 

$subs = get_all_substrings("Hello world!"); 
print_r($subs); 

?> 

Thậm chí nếu có một fancy hai lót để thực hiện điều này, tôi nghi ngờ đó là bất kỳ hiệu quả hơn hay dễ hiểu (đối với bất cứ ai để hiểu nó có lẽ họ sẽ phải nhìn vào tài liệu. Hầu hết mọi người có thể nhận được những gì chất nền không thậm chí tìm kiếm nó lên).

+0

mb_strlen và mb_substr nên được sử dụng cho bất kỳ mã hóa không chuẩn nào thay vì – Karsten

+1

Câu trả lời của Lukman là đúng. Tôi đã không nhận ra không gian là đáng kể. – echo

+0

Vâng - xin lỗi, tôi có thể đã làm điều đó rõ ràng hơn. Bản thân thuật toán bạn đã cung cấp là điểm mặc dù - cảm ơn cho đầu vào! –

-4

Đối với chuỗi thậm chí khá ngắn, bộ nhớ và thời gian chạy yêu cầu sẽ nổ . Ngay cả trong mã nguồn gốc này là một vấn đề hiệu suất đáng sợ.

Giải thích lý do tại sao bạn cần chức năng này và tìm ra cách khác xung quanh vấn đề.

0

Chúng có thể được coi là mảng của biểu mẫu đó.

Chỉ cần giải quyết nội dung bằng hàm lấy chỉ mục làm tham số và trả về chuỗi được cắt một cách thích hợp.

3

chỉnh nhỏ để thứ hai:

<?php 
function get_all_substrings($input){ 
$subs = array(); 
$length = strlen($input); 
for($i=0; $i<$length; $i++){ 
    for($j=$i; $j<$length; $j++){ 
     $subs[] = substr($input, $i, ($j - $i) + 1);  
    } 
} 
return $subs; 
} 

$subs = get_all_substrings("abc"); 
print_r($subs); 

?> 
+0

nhận thấy sự thay đổi trong tham số thứ hai đối với hàm nền. – Spartan

0

Và câu hỏi này sẽ không trọn vẹn nếu thiếu câu trả lời đệ quy:

function get_substrings($str){ 
    $len = strlen($str); 
    $ans = array(); 
    $rest = array(); 
    for ($i = 1; $i <= $len; $i++) {     
     $ans[] = substr($str, 0, $i);   
    } 
    if($str){ 
     $rest = get_substrings(substr($str, 1)); 
    } 
    return array_merge($ans, $rest); 
} 

$subs = get_substrings("abc"); 
print_r($subs); 
0

này hoạt động và nó cũng làm việc với chuỗi multibyte, tất cả các phương pháp ở trên không, chúng trả lại giá trị null và trùng lặp.

function substrings($str, $charset = 'UTF-8') { 
    $length = mb_strlen($str, $charset); 

    $subs = []; 
    for ($i = 0; $i < $length; $i++) 
    for ($j = 1; $j <= $length; $j++) 
     $subs[] = mb_substr($str, $i, $j, $charset); 

    return array_unique($subs); 
} 

print_r(substrings("php")); 
Các vấn đề liên quan