2012-07-11 19 views
73

Without foreach, thế nào tôi có thể biến một mảng như thế nàyLàm thế nào để nổ tung mảng với khoá và giá trị mà không foreach trong PHP

array("item1"=>"object1", "item2"=>"object2",......."item-n"=>"object-n"); 

thành một chuỗi như thế này

item1='object1', item2='object2',.... item-n='object-n' 

tôi nghĩ khoảng implode() rồi, nhưng nó không tạo ra khóa với nó.

Nếu cần thiết, có thể không làm tổ cho việc nghiên cứu?

EDIT: Tôi đã thay đổi chuỗi


EDIT2/UPDATE: Câu hỏi này đã được hỏi nhiều thời gian trước đây. Vào thời điểm đó, tôi muốn viết tất cả mọi thứ trong một dòng vì vậy tôi sẽ sử dụng các toán tử ternary và các cuộc gọi hàm lồng được xây dựng có lợi cho foreach. Đó không phải là một thực hành tốt! Viết mã có thể đọc được, cho dù đó là súc tích hay không không quan trọng lắm.

Trong trường hợp này: đặt foreach trong một hàm sẽ dễ đọc hơn và mô đun hơn viết một lớp lót (Mặc dù tất cả các câu trả lời đều tuyệt vời!).

+0

Làm thế nào lồng nhau foreach sẽ necesarry? – Shubham

+0

Bạn đang cố gắng làm gì? Tại sao bạn có những hạn chế đó? –

+0

đây là lớp cơ sở dữ liệu của tôi cho ứng dụng web tôi đang xây dựng, tôi không muốn nó trông lộn xộn vì nó đã được phổ biến với một nhóm foreach và for-loop tất cả cùng nhau – tom91136

Trả lời

130

và một cách khác:

$input = array(
    'item1' => 'object1', 
    'item2' => 'object2', 
    'item-n' => 'object-n' 
); 

$output = implode(', ', array_map(
    function ($v, $k) { 
     if(is_array($v)){ 
      return $k.'[]='.implode('&'.$k.'[]=', $v); 
     }else{ 
      return $k.'='.$v; 
     } 
    }, 
    $input, 
    array_keys($input) 
)); 

hay:

$output = implode(', ', array_map(
    function ($v, $k) { return sprintf("%s='%s'", $k, $v); }, 
    $input, 
    array_keys($input) 
)); 
+4

Phương pháp này là những gì Tác giả yêu cầu, nhưng cần lưu ý rằng nó là cực kỳ chậm và rằng nếu bạn đang lưu trữ thông tin này thông qua cơ sở dữ liệu thì nó sẽ vượt trội hơn cả vòng lặp và điều này để chỉ sử dụng json_encode. Phụ lục A: http://willem.stuursma.name/2010/11/22/a-detailed-look-into-array_map-and-foreach/ – Iscariot

+0

Không có liên kết nào ở đây dường như hoạt động nữa, tất cả đều là 'echo 'Xin chào , Thế giới! ";' Tôi có nên xem các ví dụ mã của các chức năng đó không? –

+0

Phương pháp này rất dễ tùy chỉnh theo nhu cầu riêng. –

4

Tôi sẽ sử dụng serialize() hoặc json_encode().

Mặc dù nó sẽ không cung cấp cho bạn chuỗi kết quả chính xác mà bạn muốn, nó sẽ dễ dàng hơn để mã hóa/lưu trữ/truy xuất/giải mã sau này.

+1

tôi cần chuỗi để xem chính xác như vậy – tom91136

2

Thay đổi

- return substr($result, (-1 * strlen($glue))); 
+ return substr($result, 0, -1 * strlen($glue)); 

nếu bạn muốn resive toàn bộ chuỗi mà không có $ ngoái keo

function key_implode(&$array, $glue) { 
    $result = ""; 
    foreach ($array as $key => $value) { 
     $result .= $key . "=" . $value . $glue; 
    } 
    return substr($result, (-1 * strlen($glue))); 
} 

Và việc sử dụng:

$str = key_implode($yourArray, ","); 
+0

'mà không có foreach' - xin vui lòng đọc lại Câu hỏi của OP. –

+0

tôi hiểu rằng đây là một lựa chọn hợp lệ để viết vòng lặp foreach mỗi lần. UPVOTED;) –

121

Bạn có thể sử dụng http_build_query, như thế này :

<?php 
    $a=array("item1"=>"object1", "item2"=>"object2"); 
    echo http_build_query($a,'',', '); 
?> 

Output:

item1=object1, item2=object2 

Demo

+1

là có thể biến object1 thành 'object1' – tom91136

+3

Không bao giờ sử dụng các tham số khác của 'http_build_query'. –

+10

+1 Địa ngục yeah Tôi thích tìm kiếm chút cốm của sự tốt lành như thế này :) – Ben

3

Sử dụng array_walk

$a = array("item1"=>"object1", "item2"=>"object2","item-n"=>"object-n"); 
$r=array(); 
array_walk($a, create_function('$b, $c', 'global $r; $r[]="$c=$b";')); 
echo implode(', ', $r); 

IDEONE

+0

Tôi thích cách tiếp cận array_walk, nhưng tôi không hiểu tại sao mọi người đề nghị sử dụng 'create_function' thay vì chỉ sử dụng một hàm ẩn danh? – Rikki

+0

@Rikki Khả năng tương thích! –

+0

Ah! Tôi đã không nhận ra đó là một điều PHP4! – Rikki

2

Đối với mục đích gỡ lỗi. Recursive ghi một mảng các mảng lồng nhau vào một chuỗi. Được sử dụng foreach. Cửa hàng chức năng Ký tự ngôn ngữ quốc gia.

function q($input) 
{ 
    $glue = ', '; 
    $function = function ($v, $k) use (&$function, $glue) { 
     if (is_array($v)) { 
      $arr = []; 
      foreach ($v as $key => $value) { 
       $arr[] = $function($value, $key); 
      } 
      $result = "{" . implode($glue, $arr) . "}"; 
     } else { 
      $result = sprintf("%s=\"%s\"", $k, var_export($v, true)); 
     } 
     return $result; 
    }; 
    return implode($glue, array_map($function, $input, array_keys($input))) . "\n"; 
} 
16

Tôi đã sử dụng phép đo (100000 lần lặp), cách nhanh nhất để dán mảng kết hợp là gì?

Mục tiêu: Để có được một dòng 1.000 mặt hàng, trong định dạng này: "chìa khóa: giá trị, key2: value2"

Chúng tôi có mảng (ví dụ):

$array = [ 
    'test0' => 344, 
    'test1' => 235, 
    'test2' => 876, 
    ... 
]; 

thử nghiệm số một:

Sử dụng http_build_querystr_replace:

str_replace('=', ':', http_build_query($array, null, ',')); 

Thời gian trung bình để nổ tung 1000 yếu tố: 0,00012930955084904

số thử nghiệm hai:

Sử dụng array_mapimplode:

implode(',', array_map(
     function ($v, $k) { 
      return $k.':'.$v; 
     }, 
     $array, 
     array_keys($array) 
    )); 

Thời gian trung bình để nổ tung 1000 yếu tố: 0,000 4890081976675

thử nghiệm thứ ba:

Sử dụng array_walkimplode:

array_walk($array, 
     function (&$v, $k) { 
      $v = $k.':'.$v; 
     } 
    ); 
implode(',', $array); 

Thời gian trung bình để nổ tung 1000 yếu tố: 0,0003874126245348

số thử nghiệm bốn:

Sử dụng foreach:

$str = ''; 
    foreach($array as $key=>$item) { 
     $str .= $key.':'.$item.','; 
    } 
    rtrim($str, ','); 

Thời gian trung bình để nổ tung 1000 yếu tố: 0,00026632803902445

tôi có thể kết luận rằng cách tốt nhất để dán các mảng - sử dụng http_build_query và str_replace

+1

'$ s = ''; foreach ($ array là $ k => $ v) {if ($ s! == null) {$ s. = ','; } $ s. = "{$ k}: {$ v}"; } 'hoạt động tốt hơn tất cả những thứ khác. – Fleshgrinder

0

Bạn cũng có thể sử dụng array_reduce của PHP,

$a = ['Name' => 'Last Name']; 

function acc($acc,$k)use($a){ return $acc .= $k.":".$a[$k].",";} 

$imploded = array_reduce(array_keys($a), "acc"); 
0

Đối tạo mysql nơi có điều kiện từ mảng

$sWheres = array('item1' => 'object1', 
       'item2' => 'object2', 
       'item3' => 1, 
       'item4' => array(4,5), 
       'item5' => array('object3','object4')); 
$sWhere = ''; 
if(!empty($sWheres)){ 
    $sWhereConditions = array(); 
    foreach ($sWheres as $key => $value){ 
     if(!empty($value)){ 
      if(is_array($value)){ 
       $value = array_filter($value); // For remove blank values from array 
       if(!empty($value)){ 
        array_walk($value, function(&$item){ $item = sprintf("'%s'", $item); }); // For make value string type 'string' 
        $sWhereConditions[] = sprintf("%s in (%s)", $key, implode(', ', $value)); 
       } 
      }else{ 
       $sWhereConditions[] = sprintf("%s='%s'", $key, $value); 
      } 
     } 
    } 
    if(!empty($sWhereConditions)){ 
     $sWhere .= "(".implode(' AND ', $sWhereConditions).")"; 
    } 
} 
echo $sWhere; // (item1='object1' AND item2='object2' AND item3='1' AND item4 in ('4', '5') AND item5 in ('object3', 'object4'))