2012-07-11 15 views
73

Bez foreach, jak mogę włączyć tablicę jak tenJak implozji tablicę z klucza i wartości bez foreach w PHP

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

na sznurku jak ten

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

myślałem około implode() już, ale nie implikuje klucza z nim.

Jeśli foreach jest to konieczne, czy nie można zagnieździć foreach?

EDIT: Zmieniłem o jakieś


Edit2/update: to pytano już jakiś czas temu. W tym czasie chciałem napisać wszystko w jednym wierszu, więc używałbym potrójnych operatorów i gniazd wbudowanych w wywołania funkcji na rzecz foreach. To nie była dobra praktyka! Zapis kodu, który jest czytelny, bez względu na to, czy jest zwięzły, czy nie, nie ma większego znaczenia.

W tym przypadku: umieszczenie foreach w funkcji będzie znacznie bardziej czytelne i modułowe niż pisanie jednolinijkowego (mimo że wszystkie odpowiedzi są świetne!).

+0

Jak zagnieżdżonych foreach byłyby necesarry? – Shubham

+0

Co próbujesz? Dlaczego masz te ograniczenia? –

+0

to była moja klasa baz danych dla aplikacji internetowej, którą buduję, nie chcę, żeby wyglądała na niechlujną, ponieważ jest już zapełniona wiązką foreach i for-loop wszystkie razem – tom91136

Odpowiedz

130

i inny sposób:

$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) 
)); 

czyli

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

Ta metoda jest tym, o co prosił autor, ale należy zauważyć, że jest ona krytycznie wolniejsza i jeśli przechowujesz te informacje przez bazę danych, byłaby znacznie lepsza zarówno od pętli, jak i po prostu do użycia json_encode. Dowód A: http://willem.stuursma.name/2010/11/22/a-detailed-look-into-array_map-and-foreach/ – Iscariot

+0

Żaden z linków tutaj nie działa, wszystkie one "echo" Hello , Świat! ";' Czy powinienem zobaczyć przykłady kodu z tych funkcji? –

+0

Ta metoda jest bardzo łatwa do dostosowania do własnych potrzeb. –

4

Chciałbym użyć serialize() lub json_encode().

Mimo że nie poda dokładnego wyniku wyszukiwania, znacznie łatwiej będzie kodować/przechowywać/pobierać/dekodować później.

+1

Potrzebuję napisu, żeby wyglądał dokładnie tak jak ten – tom91136

2

Zmień

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

jeśli chcesz resive cały ciąg bez ostatnie $ kleju

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

a użycie:

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

'bez foreach' - proszę ponownie przeczytać Pytanie OP. –

+0

Rozumiem, że jest to poprawna alternatywa dla pisania pętli foreach za każdym razem. UPVOTED;) –

121

można użyć http_build_query, jak to :

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

wyjściowa:

item1=object1, item2=object2 

Demo

+1

czy można uczynić obiekt1 w "object1" – tom91136

+3

Nigdy nie używał innych parametrów 'http_build_query'. –

+10

+1 Hell yeah Uwielbiam znajdować takie samorodki dobroci jak ta :) – Ben

3

Korzystanie 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

Podoba mi się podejście array_walk, ale nie rozumiem, dlaczego ludzie sugerują użycie 'create_function' zamiast po prostu używać anonimowej funkcji? – Rikki

+0

@Rikki Kompatybilność! –

+0

Ah! Nie zdawałem sobie sprawy, że to jest PHP4! – Rikki

2

Dla celów debugowania. Rekurencyjne napisz tablicę zagnieżdżonych tablic do łańcucha. Używane foreach. Funkcja przechowuje znaki języka narodowego.

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

Wydałem pomiary (100000 powtórzeń), jaki jest najszybszy sposób na sklejenie tablicy asocjacyjnej?

Cel: Aby uzyskać linię 1000 pozycji, w tym formacie: "klucz: wartość, Klawisz2: wartość2"

Mamy tablicę (na przykład):

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

testową Numer jeden:

Zastosowanie http_build_query i str_replace:

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

Średni czas do implozji 1000 elementów: 0,00012930955084904

Numer testu dwa:

Wpisz array_map i implode:

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

Średni czas do implozji 1000 elementy: 0.000 4890081976675

testowy numer trzy:

Zastosowanie array_walk i implode:

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

średni czas do implozji 1000 elementów: 0.0003874126245348

numer testowy cztery:

Zastosowanie foreach:

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

Średni czas do implozji 1000 elementów: 0,00026632803902445

mogę stwierdzić, że najlepszym sposobem, aby przykleić tablicę - stosowanie http_build_query i str_replace

+1

'$ s = ''; foreach ($ tablica jako $ k => $ v) {if ($ s! == null) {$ s. = ','; } $ s. = "{$ k}: {$ v}"; } 'przewyższa wszystkie inne. – Fleshgrinder

0

You może używać także PHP array_reduce,

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

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

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

Aby utworzyć mysql gdzie warunki z tablicy

$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')) 
Powiązane problemy