2016-12-28 6 views
1

Ich habe wie diese Array1:PHP array_keys mehrere Ebenen

Array 
(
[0] => 123 
[1] => 456 
[2] => 789 
) 

Und Array 2 gefällt dieses

Array 
(

[0] => Array 
    (
     [0] => some text 
     [1] => 888 
     [2] => some 
     [3] => text 
    ) 
    [1] => Array 
    (
     [0] => some text 
     [1] => 123 
     [2] => some 
     [3] => text 
    ) 
    [2] => Array 
    (
     [0] => some text 
     [1] => 999 
     [2] => some 
     [3] => text 
    ) 
    [3] => Array 
    (
     [0] => some text 
     [1] => Array 
      (
       [1] => 456 
       [2] => 789 
      ) 
     [2] => some 
     [3] => text 
    ) 
    [4] => Array 
    (
     [0] => some text 
     [1] => 123 
     [2] => some 
     [3] => text 
    ) 
) 

Ich bin nur 1. Spalte der zweiten Reihe überprüft und Werte zu finden, die Werte übereinstimmen von der ersten Array. Das ist mein Code:

$test=array(); 

$xcol = array_column($array2, 1); 
foreach($array1 as $key => $value) { 
if(($foundKey = array_keys($xcol, $value)) !== false) { 
$rrt=$foundKey; 
foreach($rrt as $rte){ 
    $test[]=$array2[$rte]; 
} 
} 
} 

echo "<pre>"; 
print_r($test); 
echo "</pre>"; 

Es funktioniert und gibt mir richtige Ergebnisse, aber es überprüft nicht für alle Ebenen. Kann mir bitte jemand sagen, was mache ich falsch? Meine Ausgabe ist:

Array 
(

    [0] => Array 
    (
     [0] => some text 
     [1] => 123 
     [2] => some 
     [3] => text 
    ) 
    [1] => Array 
    (
     [0] => some text 
     [1] => 123 
     [2] => some 
     [3] => text 
    ) 
    ) 

und die gewünschte Ausgabe ist:

Array 
(

    [0] => Array 
    (
     [0] => some text 
     [1] => 123 
     [2] => some 
     [3] => text 
    ) 
    [1] => Array 
    (
     [0] => some text 
     [1] => Array 
      (
       [1] => 456 
       [2] => 789 
      ) 
     [2] => some 
     [3] => text 
    ) 
    [2] => Array 
    (
     [0] => some text 
     [1] => 123 
     [2] => some 
     [3] => text 
    ) 
    ) 
+0

könnten Sie die [ 'recursiveArrayIterator'] verwenden (http://php.net/manual/en/class.recursivearrayiterator.php) –

+0

http://php.net/manual/en/function.is-array.php – Hackerman

+0

@mister martin, können Sie mir einen Tipp geben, wie würde ich als array_key Suche verwenden, um Wert zu finden und immer noch alles andere Sub-Array enthalten ausgeben? Ich habe noch nie recursiveArrayIterator verwendet, also bin ich ein wenig verwirrt – codexy

Antwort

1

Lösung:

eine Schleife erstellen Sie Ihre welche Schleife $array2 welche Daten Sie $array1 whos Werte übereinstimmen in der ersten Reihe bekommen wollte hält

foreach($array2 as $data) { 

Looping eine weitere Schleife erzeugen, die Schleife Ihre Indizes

foreach($data as $value) { 

Aber vorher als erstellen eine Bedingung, wenn Ihr Indexwert es Array-Schleife ist und überprüfen Sie es seinen Indexwert Übereinstimmung in allen Indizes aus $array1 Verwendung PHP-Funktion in_array für diese

 if (gettype($value) == "array") { 
      foreach($value as $val) { 
       if (in_array($val, $array1)) { 
        $result[] = $data; 

Dann, wenn Sie aufhören finden es nur die Schleife break mit vermeiden Vervielfältigung

    break; 
       } 
      } 

Else verwenden Sie nur direkt in_array

 } else if (in_array($value, $array1)) { 
      $result[] = $data; 
     } 
    } 
} 

einfach den Code hier greifen in Demo

Hilfe es nur zu markieren, hilft es beantworten, wenn Sie damit zufrieden sind

1

Ermöglicht eine rekursive Methode dafür machen. Was ist Rekursion, die du fragst? Nun, es ist einfach eine Methode, die sich selbst nennt.

<?php 
$array1 = array(123,456,789); 
$array2 = array(
    array(
     "some text" 
     , 888 
     , "some" 
     , "text" 
    ), 
    array(
     "some text" 
     ,123 
     ,"some" 
     ,"text" 
    ), 
    array(
     "some text" 
     ,999 
     ,"some" 
     ,"text" 
    ), 
    array(
     "some text" 
     ,array(456,789) 
     ,"some" 
     ,"text" 
    ), 
    array(
     "another text" 
     ,123 
     ,"some" 
     ,"text" 
    ) 
); 
$final = array(); 
foreach($array1 as $needle){ 
    foreach($array2 as $haystack){ 
     if(find($needle,$haystack)){ 
      $final[] = $haystack; 
     } 
    } 
} 

print_r($final); 

function find($needle, $haystack){ 
    $result = false; 
    foreach ($haystack as $value) { 
     if(is_array($value)){ 
      $result = find($needle, $value); 
     } else { 
      if($needle == $value){ 
       $result = true; 
      } 
     } 
    } 
    return $result; 
} 
+0

Ich bearbeitet meine Frage mit der Ausgabe auch – codexy

+0

@codexy Ich möchte nur sicherstellen, dass Sie nur den Schlüssel des Top-Level-Array, das eine Übereinstimmung in ihm hat wollen? – nerdlyist

+0

Ja, die Übereinstimmung wäre 3 (in diesem speziellen Fall), und das ist alles was ich brauche, also kann ich Werte davon abrufen. – codexy

Verwandte Themen